LeetCode二叉树专题 (7) 平衡二叉树

147 阅读1分钟

题目

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1

解题思路

根据题目中高度平衡的定义,这道题就转换了求左右子树高度的绝对值,小于等于1就是平衡二叉树。这个就是这道题的子问题,我们只要迭代这个子问题就可以了,如果一棵树上的所有节点都满足这个条件,那么这个树就是一个平衡二叉树。求二叉树的深度,我们之前有过类似的题目LeetCode二叉树专题 (4) 二叉树的最大深度
现在我们想这么一个问题,如果从跟节点判断起,再判断他的左右节点,这样是不是会重复计算很多次底部树的深度,显然这样的效率是很低,所以我们最好是从底部开始算起,这样底部的数据就可以让顶层的节点使用,不需要重复计算了。

    public boolean isBalanced(TreeNode root) {
        //-1标记不符合平衡的条件
        return getDeep(root) != -1;
    }

    public int getDeep(TreeNode root){
        if(root == null){
            return 0;
        }
        int left = getDeep(root.left) + 1;
        int right = getDeep(root.right) + 1;
        if(left == 0 || right == 0){
            //如果有一个节点不满足,那么所有都直接返回-1
            return -1;
        }
        if(Math.abs(left-right) > 1){
            //这个节点的左右最大深度差值大于1,不是平衡的
            return -1;
        }
        //返回左右的深度
        return Math.max(left,right);
    }