110. 平衡二叉树

 

 

暂时没有想到非递归的方法,这里用递归来处理了

根据题目的定义,我们可以通过计算每一棵子树的左右高度差,

只要有一个子树不平衡,则整体不平衡(这里有个优化小细节,我们以-1为标记位,当出现-1则整棵树

不平衡,不需要再做后续判断)

时间O(n),空间O(n)

    private int def(TreeNode root) {
        if (root == null) return 0;
        // 递归计算左右子树的高度
        int left = def(root.left);
        // 此处返回-1是必要的,不仅是剪枝,也是防止出现返回时-1-(-1)导致结果错误
        if(left == -1) return -1;
        int right = def(root.right);
        if(right == -1) return -1;
        // 当左右子树高度差在2以内,则返回子树的高度(左右子树高度差+1,+1为根节点高度)
        // 左右子树高度差超过2,可以直接判断整颗树不平衡,直接返回结果
        return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
    }

 

 
posted @ 2021-04-08 14:30  jchen104  阅读(55)  评论(0)    收藏  举报