题解 | #平衡二叉树#

平衡二叉树

https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=13&&tqId=11192&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

39、平衡二叉树

解题思路

这道题目其实跟二叉树的深度这道题用到的方法是一样的,为什么说是一样的呢?因为我们求二叉树的深度,其实就是求了左右子树的深度的最大值,但是这道题目是要让我们判断二叉树是不是平衡树。

我们都知道如何判断一棵二叉树是不是平衡二叉树,就是它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

所以,这个时候我们只需要判断左右子树的深度之差有没有超过1,若超过了则不是平衡的,反之则为平衡二叉树。

我们先来回顾一下求二叉树深度的代码:

public int TreeDepth(TreeNode root) {
        if(root == null)
            return 0;
        int l = TreeDepth(root.left);
        int r = TreeDepth(root.right);
        return Math.max(l,r)+1;
    }

我们只需要在上面的代码加上判断左右子树的深度之差即可。

(左子树深度-右子树深度) > 1,不是平衡树

所以代码可以改为:

    boolean isBalanced = true; // 默认标记为true
    public boolean IsBalanced_Solution(TreeNode root) {
        TreeDepth(root);
        return isBalanced;
    }

public int TreeDepth(TreeNode root) {
        if(root == null)
            return 0; // 递归终止
        int l = TreeDepth(root.left);
        int r = TreeDepth(root.right);

        if(Math.abs(l-r) > 1){
            isBalanced = false;  // 不是平衡树
        }

        return Math.max(l,r)+1; // 求深度
    }

但是,上面的代码总是遍历完全部的节点,我们想想,如果一判断到左右子树的深度之差大于1,即这个二叉树就不可能再是平衡树了。

所以,我们还可以对上面代码进行优化。

进行剪枝:当判断到左右子树的深度之差大于1的时候,则返回-1。每次递归结束判断返回值是否-1,若为-1,则立即返回。

所以优化后的代码为:

    boolean isBalanced = true;
    public boolean IsBalanced_Solution(TreeNode root) {
        TreeDepth(root);
        return isBalanced;
    }

public int TreeDepth(TreeNode root) {
        if(root == null)
            return 0;
        int l = TreeDepth(root.left);
        if(l == -1)  return -1;  // 提前返回
        int r = TreeDepth(root.right);
        if(r == -1)  return -1;  // 提前返回
         if(Math.abs(l-r) > 1){
            isBalanced = false;  // 不是平衡树
            return -1;  // 加一个标记-1,已经不可能是平衡树了
        }

        return Math.max(l,r)+1;
    }

看一下整体动态图:

39

复杂度分析:

时间复杂度:O(N)。N为树的节点个数。最差情况下需要遍历所有节点。

空间复杂度:O(N)。若树退化成了链表,则递归深度为节点的个数,需要用到O(N)的栈空间。

剑指offer 文章被收录于专栏

为刷过的每一道题都书写一篇题解,便于重复练习~

全部评论
if(l == -1) return -1; // 提前返回 这里怎么理解啊 为什么==-1就不是平衡树了
1 回复 分享
发布于 2021-12-05 23:27
精辟的讲解,我看到的最好的讲解
1 回复 分享
发布于 2021-09-25 00:19
学到了,感谢
点赞 回复 分享
发布于 2021-09-06 17:12
剪纸,这样做会方便更多吧 import java.lang.Math; public class Solution { private boolean isBalanced = true; public boolean IsBalanced_Solution(TreeNode root) { isBalancedTree(root); return isBalanced; } public Integer isBalancedTree(TreeNode root){ if (!isBalanced) return 0; if (root == null) return 0; Integer leftTree = isBalancedTree(root.left); Integer rightTree = isBalancedTree(root.right); if (Math.abs(leftTree - rightTree) > 1) isBalanced = false; return Math.max(leftTree, rightTree) + 1; } }
点赞 回复 分享
发布于 2021-11-29 10:55
剪枝改进一下,不需要返回-1,直接使用isBalanced即可 class Solution { public: bool isBalanced=true; bool IsBalanced_Solution(TreeNode* pRoot) { depth(pRoot); return isBalanced; } int depth(TreeNode*p){ if (!p) return 0; if (!isBalanced) return -1; int l = depth(p->left); int r = depth(p->right); if (abs(l-r)>1) isBalanced = false; return max(l,r)+1; } };
点赞 回复 分享
发布于 2022-01-02 21:42
容易看懂 感谢😊
点赞 回复 分享
发布于 2022-07-26 13:06
nice很简洁,不过建议还是不要在TreeDepth方法中作isBalance的判断,这样容易出bug,哈哈哈
点赞 回复 分享
发布于 2022-11-11 18:32 陕西

相关推荐

点赞 评论 收藏
分享
52 15 评论
分享
牛客网
牛客企业服务