110. 平衡二叉树

解法一:自顶向下递归

自顶向下地判断各个结点。
判断某顶点为根结点的树是否为平衡二叉树,首先要满足的条件是:对于这个顶点,左子树的高度和右子树的高度之差的绝对值小于等于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;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述(简单难度) 判断一棵树是否是平衡二叉树,平衡二叉树定义如下: 它是一棵空树或它的左右两个子树的高度差的绝...
    windliang阅读 253评论 0 0
  • 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 ...
    zhipingChen阅读 402评论 0 1
  • 题目 难度:★★☆☆☆类型:二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义...
    玖月晴阅读 1,293评论 0 0
  • 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的...
    大蜡笔阅读 178评论 0 0
  • 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 ...
    youzhihua阅读 160评论 0 0