判断二叉树是不是平衡的

来源:互联网 发布:wifi信号干扰软件 编辑:程序博客网 时间:2024/05/21 07:56
问题描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:


         思路:对于树的题目,第一反应就是用递归。对于以某个结点为根的树,只需计算出它的左右子树的深度,如果深度相差小于等于1,则递归判断它的左右子树是不是平衡树;否则肯定不是平衡二叉树。这个问题的关键是要计算树的深度,如果是自顶向下,会有很多重复的计算。计算以1为根的树的深度,会牵涉到以2为根、以3为根的子树。计算以2为根的树的深度,会牵涉到以4为根、以5为根的子树。由于要遍历每个结点,判断以该结点为根的树是不是平衡二叉树。所以计算以1为根的树的深度,与计算以2为根的树的深度,会重复计算以4为根、以5为根的子树的深度。

          消除重复办法,当时是能记录下之前计算过的子树的深度,下次使用就不用重新计算。这就需要自底向上的计算深度。庆幸的是递归解决树的问题,就是自底向上的过程。因为我们在递归求解中,先要得出子树的解,子树的解最终会转换为叶结点的解。可以利用后序遍历的方法,遍历每个结点时,先判断它的左右子树是不是平衡二叉树,同时记录下左右子树的深度,然后判断该结点为根的树是不是平衡二叉树,至于该树的深度计算很方便,取左右子树中较大的深度+1就可以了。这里左右子树的深度在递归求解中已经计算出来,不需要重复计算了。

       参考代码:

[cpp] view plaincopyprint?
  1. struct BinaryTreeNode  
  2. {  
  3.     int data;  
  4.     BinaryTreeNode *pLeft;  
  5.     BinaryTreeNode *pRight;  
  6. };  
  7. //函数功能 : 判断二叉树是不是平衡的  
  8. //函数参数 : pRoot为根结点,pDepth为根结点的深度。  
  9. //返回值 :   是否平衡的  
  10. bool IsBalanced(BinaryTreeNode *pRoot, int *pDepth)  
  11. {  
  12.     if(pRoot == NULL)  
  13.     {  
  14.         *pDepth = 0;  
  15.         return true;  
  16.     }  
  17.     int leftDepth, rightDepth; //左右子树的深度  
  18.     if(IsBalanced(pRoot->pLeft, &leftDepth)&&  
  19.         IsBalanced(pRoot->pRight, &rightDepth))  
  20.     {  
  21.         int diff = leftDepth - rightDepth;  
  22.         if(diff == 0 || diff == 1 || diff == -1)  //相差为0或1或-1  
  23.         {  
  24.             *pDepth = 1 + (leftDepth > rightDepth ? leftDepth: rightDepth);   
  25.             return true;  
  26.         }  
  27.         else  
  28.             return false;  
  29.     }  
  30.     return false;  
0 0
原创粉丝点击