判断二叉树是不是平衡的
来源:互联网 发布:wifi信号干扰软件 编辑:程序博客网 时间:2024/05/21 07:56
问题描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:
思路:对于树的题目,第一反应就是用递归。对于以某个结点为根的树,只需计算出它的左右子树的深度,如果深度相差小于等于1,则递归判断它的左右子树是不是平衡树;否则肯定不是平衡二叉树。这个问题的关键是要计算树的深度,如果是自顶向下,会有很多重复的计算。计算以1为根的树的深度,会牵涉到以2为根、以3为根的子树。计算以2为根的树的深度,会牵涉到以4为根、以5为根的子树。由于要遍历每个结点,判断以该结点为根的树是不是平衡二叉树。所以计算以1为根的树的深度,与计算以2为根的树的深度,会重复计算以4为根、以5为根的子树的深度。
消除重复办法,当时是能记录下之前计算过的子树的深度,下次使用就不用重新计算。这就需要自底向上的计算深度。庆幸的是递归解决树的问题,就是自底向上的过程。因为我们在递归求解中,先要得出子树的解,子树的解最终会转换为叶结点的解。可以利用后序遍历的方法,遍历每个结点时,先判断它的左右子树是不是平衡二叉树,同时记录下左右子树的深度,然后判断该结点为根的树是不是平衡二叉树,至于该树的深度计算很方便,取左右子树中较大的深度+1就可以了。这里左右子树的深度在递归求解中已经计算出来,不需要重复计算了。
参考代码:
- struct BinaryTreeNode
- {
- int data;
- BinaryTreeNode *pLeft;
- BinaryTreeNode *pRight;
- };
- //函数功能 : 判断二叉树是不是平衡的
- //函数参数 : pRoot为根结点,pDepth为根结点的深度。
- //返回值 : 是否平衡的
- bool IsBalanced(BinaryTreeNode *pRoot, int *pDepth)
- {
- if(pRoot == NULL)
- {
- *pDepth = 0;
- return true;
- }
- int leftDepth, rightDepth; //左右子树的深度
- if(IsBalanced(pRoot->pLeft, &leftDepth)&&
- IsBalanced(pRoot->pRight, &rightDepth))
- {
- int diff = leftDepth - rightDepth;
- if(diff == 0 || diff == 1 || diff == -1) //相差为0或1或-1
- {
- *pDepth = 1 + (leftDepth > rightDepth ? leftDepth: rightDepth);
- return true;
- }
- else
- return false;
- }
- return false;
0 0
- 判断二叉树是不是平衡的
- 判断二叉树是不是平衡的
- 判断二叉树是不是平衡的
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡[
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断是不是平衡二叉树
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- C#捕获摄像头进行拍照和录像资料总结
- 每次开机都会自动打开c:\windows\system32目录
- HBase Block Cache实现机制分析
- SyntaxError: JSON.parse: expected property name or '}'
- 电脑开机按F1才能正常启动的原因和解决方法
- 判断二叉树是不是平衡的
- QDI主板的保护功能导致的电脑关机故障
- 学习spring security3的通俗理解
- js 倒计时代码
- adroid phone MT 的流程
- hortonworks架构
- 硬件原因导致电脑蓝屏的解决方法
- uva 11795 - Mega Man's Mission(dp)
- ecos下tcp/ip协议栈