如何判断一个树是否是平衡二叉树

#判断一个树是二叉平衡树

平衡二叉树十是一种高度自平衡树,它的任何一个结点的左右子树的高度之差不会查过1。

  1. 递归方法:从定义个就可以写出一个递归的解法,先求左右子树是否平衡然后,再判断自己是否平衡。代码如下
class Solution { public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot==NULL) return 1; int left=TreeDepth(pRoot->left); int right=TreeDepth(pRoot->right); int diff=left-right; if(diff>1 || diff<-1) return 0; return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right); } private: int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; int left=TreeDepth(pRoot->left); int right=TreeDepth(pRoot->right); return (left>right?left:right)+1; } }; 
  1. 递归解法2:递归算法每次先计算左右子树的深度,再计算本身的深度,然后递归的判断左右子树的时候,又计算了左右子树的深度,这是很不合理的方法,那么想要规避这个情况就可以把深度记录下来,用一个变量记录每个节点的深度,并且借助递归后序遍历树,从而先访问左子树,再访问右子树,有了这两边的高度,再判断本身。
class Solution { public: bool IsBalanced_Solution(TreeNode* pRoot) { int depth=0; return isBalanced_Solution(pRoot,depth); } private: bool isBalanced_Solution(TreeNode* pRoot,int& depth){ if(pRoot==NULL){ depth=0; return 1; } int left=0,right=0; if(isBalanced_Solution(pRoot->left,left) && isBalanced_Solution(pRoot->right,right)){ int diff=left-right; if(diff<=1 && diff>=-1){ depth=1+(left>right?left:right); return true; } } return 0; } }; 

 比较,第一种方法是递归求深度,从上往下判断是否平衡,有很多重复计算。第二种方法则是后序遍历,用一个变量保持深度,从下往上判断,只计算了一次。这个原因就在于下面平衡了,只需判断上面就可以,而上面平衡下面确不一定平衡,所以自下而上更好。

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/nwpubear/article/details/81914598
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞