【面试算法专栏及回答思考】——平衡二叉树

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:true
复制代码
示例 2:

img

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
复制代码
示例 3:
输入:root = []
输出:true
复制代码
提示:
  • 树中的节点数在范围 [0, 5000]
  • -104 <= Node.val <= 104

解题

解题思路

我们还是来理一下这道题的解题思路。首先平衡二叉树就是,每一个节点的左右子树高度差不能大于一,即要求判断每个节点是否平衡。

因此我们在这儿就有个很清晰的思路:需要在递归的函数getMaxDepth里边进行判断,而且还需要一种方法能够把错误信息传出来。这里既然错误信息比较简单,不妨利用 回传-1这种不合法值 的方式来解决。

解题过程

方法一:自顶向下(暴力法)

自顶向下的比较每个节点的左右子树的最大高度差,如果二叉树中每个节点的左右子树最大高度差小于等于 1 ,即每个子树都平衡时,此时二叉树才是平衡二叉树

方法二:自底向上(优化)

利用后续遍历二叉树(左右根),从底至顶返回子树最大高度,判定每个子树是不是平衡树 ,如果平衡,则使用它们的高度判断父节点是否平衡,并计算父节点的高度,如果不平衡,返回 -1 。

遍历比较二叉树每个节点 的左右子树深度:

比较左右子树的深度,若差值大于 1 则返回一个标记 -1 ,表示当前子树不平衡 左右子树有一个不是平衡的,或左右子树差值大于 1 ,则二叉树不平衡 若左右子树平衡,返回当前树的深度(左右子树的深度最大值 +1 )

代码实现

自顶向下:

class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) return true;
        int left = getDepth(root.left);
        int right = getDepth(root.right);
        if (Math.abs(left - right) > 1){
            return false;
        }
        return isBalanced(root.left) && isBalanced(root.right);
    }

    public int getDepth(TreeNode root){
        if (root == null) return 0;
        int left = getDepth(root.left);
        int right = getDepth(root.right);
        return Math.max(left, right) + 1;
    }
}
复制代码

自底向上:

class Solution {
    public boolean isBalanced(TreeNode root) {
        return check(root) != -1;
    }

    public int check(TreeNode root){
        if (root == null) return 0;
        int left = check(root.left);
        if (left == -1) return -1;
        int right = check(root.right);
        if (right == -1) return - 1;
        if (Math.abs(left - right) > 1) return -1;
        return Math.max(left, right) + 1;
    }
}
复制代码

关于平衡二叉树的思考和方法今天就分享到这里,同学想看到关于算法面试中的哪些疑难解析,可以给我留言,我们一起再来探讨,我们下篇文章再见。

おすすめ

転載: juejin.im/post/7031183545687097381