美文网首页
110. 平衡二叉树

110. 平衡二叉树

作者: 天山童姥张奶奶 | 来源:发表于2020-04-20 10:26 被阅读0次

解法一:自顶向下递归

自顶向下地判断各个结点。
判断某顶点为根结点的树是否为平衡二叉树,首先要满足的条件是:对于这个顶点,左子树的高度和右子树的高度之差的绝对值小于等于1。
其次:左子树为平衡二叉树,右子树也为平衡二叉树。
综上,自顶向下递归地检查每个顶点。

缺点:自顶向下计算每个结点的高度时存在大量冗余。

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null)    return true;
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        if(Math.abs(leftHeight - rightHeight) > 1)  
            return false;
        return isBalanced(root.left) && isBalanced(root.right);
    }
    private int getHeight(TreeNode root) {
        if(root == null)    return 0;
        return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
    }
}

解法二:自底向上递归

自底向上递归地返回结点的高度。
递归的每一层要做的工作:根据向上返回得到的左右子结点的高度,判断是否平衡,若平衡,返回当前结点的高度(左右子节点高度的最大值加一)。若不平衡,则之后的高度都不必再计算了,这棵树必然不平衡,这种情况下向上返回-1。
递归结束后,若树是平衡的,将得到根结点的高度(不断通过返回的子结点的高度计算得到);若树是不平衡的,将得到-1。根据这个结果返回true/false即可。

相对于解法一,这样做可以不断通过返回的子树高度计算当前结点高度,无需向解法一那样结点的高度会被重复计算。而且可以通过返回-1来指示树是不平衡的,提前结束结点高度的计算。

class Solution {
    public boolean isBalanced(TreeNode root) {
        return getHeight(root) != -1;
    }
    private int getHeight(TreeNode root) {
        if(root == null)    return 0;
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        if(leftHeight == -1 || rightHeight == -1)
            return -1;
        if(Math.abs(leftHeight - rightHeight) > 1)
            return -1;
        return Math.max(leftHeight, rightHeight) + 1;
    }
}

相关文章

网友评论

      本文标题:110. 平衡二叉树

      本文链接:https://www.haomeiwen.com/subject/jzewbhtx.html