您的当前位置:首页正文

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

来源:九壹网

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

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;
    }	
};

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top