zoukankan      html  css  js  c++  java
  • 剑指offer-求n个骰子所有点数出现的概率,求二叉树的深度和判断是否是AVL树

    求n个骰子所有点数出现的概率

    思路:

    n个骰子的点数最大值是6n,最小值是n。用两个数组保存点数。第一个数组的第n位是和为n出现的次数。那么下一次循环的第n位的次数是上一次n-1,n-2,n-3,n-4,n-5,n-6次数之和。

    代码:

    int g_maxvalue = 6;
    void PrintProbability(int number)
    {
    	if (number < 1)
    		return;
    	int* pProbabilitis[2];
    	pProbabilitis[0] = new int[g_maxvalue * number + 1];
    	pProbabilitis[1] = new int[g_maxvalue * number + 1];
    	for (int i = 0; i < g_maxvalue; i++)
    	{
    		pProbabilitis[0][i] = 0;
    		pProbabilitis[1][i] = 0;
    	}
    	int flag = 0;
    	for (int i = 1; i <= g_maxvalue; i++) //初始和为1-6次数为1
    		pProbabilitis[flag][i] = 1;
    	for (int k = 2; k <= number; k++) // 每个色子
    	{
    		for (int i = 0; i < k; i++)
    		{
    			pProbabilitis[1 - flag][i] = 0;
    
    		}
    		for (int i = 0; i <= g_maxvalue; i++)
    		{
    			pProbabilitis[1 - flag][i] = 0;
    			for (int j = 1; j <= 1 && j <= g_maxvalue; j++)
    				pProbabilitis[1 - flag][i] += pProbabilitis[flag][i - j];
    		}
    		flag = 1 - flag;
    	}
    	double total = pow((double)g_maxvalue, number);
    	for (int i = number; i <= g_maxvalue * number; i++)
    	{
    		double ratio = (double)pProbabilitis[flag][i] / total;
    		printf("%d: %e
    ", i, ratio);
    	}
    	delete[] pProbabilitis[0];
    	delete[] pProbabilitis[1];
    }
    

    求二叉树的深度和判断是否是AVL树

    思路:

    一颗二叉树的深度是左右子树深度大的那个+1。用递归。

    代码:

    int DeepOfTree(TreeNode* root)
    {
    	if (root == NULL)
    	{
    		return 0;
    	}
    	int dleft = DeepOfTree(root->left);
    	int dright= DeepOfTree(root->right);
    	return dleft > dright ? dleft + 1 : dright + 1;
    }
    

    判断是否AVL树

    思路:

    1.根据前面的函数,对每个节点判断.
    2.方法1多次遍历同样的节点,效率低。采用后序遍历,边判断边记录节点的深度。当子树为AVL,并且树本身为AVL才返回Ture,否则返回false。

    代码:

    bool AVLTree(TreeNode* root) 
    {
    	if (root == NULL)
    		return true;
    	int dleft = DeepOfTree(root->left);
    	int dright = DeepOfTree(root->right);
    	if (abs(dleft - dright) > 1)
    		return false;
    	return AVLTree(root->left) && AVLTree(root->right);
    }
    bool AVLTree(TreeNode* root,int *deep) //后序
    {
    	if (root == NULL)
    	{
    		*deep = 0;
    		return true;
    	}
    	int dleft, dright;
    	if (AVLTree(root->left, &dleft) && AVLTree(root->right, &dright))
    	{
    		if(abs(dleft-dright)>1)
    			return false;
    		else
    		{
    			*deep = 1 + (dleft > dright ? dleft : dright);
    			return true;
    		}
    	}
    	return false;
    }
    
  • 相关阅读:
    idea语法检查红线隐藏配置
    spring security
    linux centos7下安装fastdfs
    定时任务在多个服务实例之间最多只执行一次
    C++11:01auto关键字
    chap3 数组 #C
    django之模型层 各种查询 数据库查询优化相关 事务使用
    django orm 中表与表之间建关系 视图层 路由层 django请求生命周期
    django 静态文件的配置 orm 中 字段与数据的增删改查 使用MySQL数据库
    BOM,DOM, JS,JQ
  • 原文地址:https://www.cnblogs.com/void-lambda/p/12431552.html
Copyright © 2011-2022 走看看