力扣简110 平衡二叉树

递归 自底向上

 

//给定一个二叉树,判断它是否是高度平衡的二叉树:一个二叉树"每个"节点 的左右两个子树的高度差的绝对值不超过 1
//我以为光根的左右子树了! 最初[1,2,2,3,null,null,3,4,null,null,4]报错,然后改正!写的还挺快的,熟能生巧嘻嘻。

 

 

看到别人说这种复杂度太高了555,为什么高级解法我一个都想不到!不着急,慢慢来。

 

package leetcode01;

public class Solution110 {
    
//给定一个二叉树,判断它是否是高度平衡的二叉树:一个二叉树"每个"节点 的左右两个子树的高度差的绝对值不超过 1  
//我以为光根的左右子树了! 最初[1,2,2,3,null,null,3,4,null,null,4]报错,然后改正!
    public static boolean isBalanced(TreeNode root) {
        if(root==null) {
            return true;
        }
        else{
            if(Math.abs(height(root.left)-height(root.right))<=1) {
                return (isBalanced(root.left) && isBalanced(root.right));
            }
            else{
                return false;
            }
        }
    }    
    
    public static int height(TreeNode root) {
        if(root==null) {
            return 0;
        }
        else {
            return Math.max(height(root.left), height(root.right))+1;
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

题解1思路完全一致,代码处的优化:直接把isBalanced中的else里的if去掉,换成return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);

题解2 自底向上 时间复杂度会低 但是看了题解敲了一遍发现实际执行内存更大 不知道为啥

    public static boolean isBalanced(TreeNode root) {
        return height(root)>=0;
    }
    public static int height(TreeNode root) {
        if(root==null) {
            return 0;
        }
        int left=height(root.left);
        int right=height(root.right);
        if(left==-1 || right==-1 ||Math.abs(left-right)>1 )
            return -1;
        else
            return Math.max(left, right)+1;
        
    }

 

posted @ 2022-05-21 20:21  Ssshiny  阅读(23)  评论(0)    收藏  举报