二叉树 平衡二叉树判定-分支限定

输入一棵二叉树,判断该二叉树是否是平衡二叉树

常规做法

  • 即实现一个求节点高度的树,然后遍历原二叉树
  • 每遇到一个节点,判断其左右子树高度之差是否小于等于1
  • 然后递归进入左右子树判断左右子树是否是平衡二叉树

缺点:在求解高度时,存在重复判断的情况,并且该方法无差别的遍历所有节点



public classSolution {
    public boolean IsBalanced_Solution(TreeNode root) {
        if(root == null) {
            return true;
        }
        return Math.abs(maxDepth(root.left) - maxDepth(root.right)) <= 1 &&
            IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
    }
      
    private int maxDepth(TreeNode root) {
        if(root == null) {
            return 0;
        }
        return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
    }
}

改进:从最小的叶子节点开始,若一个子树不是平衡树,立即返回-1不在遍历 (避免原方法会遍历所有节点的性能开销)

class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
        if(depth(pRoot)==-1)
            return false;
        else
            return true;

    }
    int depth(TreeNode* p)
    {
        if(p==NULL)
            return 0;
        int left=depth(p->left);
        if(left==-1)
            return -1;
        int right=depth(p->right);
        if(right==-1)
            return -1;
        if(left-right>1 || right-left>1) //不平衡
            return -1;
        return max(left+1,right+1);//返回该子树的高度
        
        
        
    }
    
};

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/88364385
今日推荐