LC[110. 平衡二叉树]

LC110. 平衡二叉树

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

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

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

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:true

提示:

  • 树中的节点数在范围 [0, 5000]
  • -104 <= Node.val <= 104

题解

方法一:自顶向下递归,通过类似于前序遍历的方法,求出当前根节点的左右子树高度并且比较,再递归调用左右子树.很明显的缺点,每次计算高度都是从最深处计算,没有利用到低层节点已经求出的高度值。在这个过程中先判断高处是否为平衡树。

时间复杂度:O(n^2)

空间复杂度O(n)

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

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

    }
}

方法二:自底向上递归。通过类似于后续遍历的方法,求当前根节点的左右子树高度时,递归调用左右子树求树高,从低处到高处求到树高,在这个过程中首先判断底层是否为平衡树。

时间复杂度:O(n)

空间复杂度:O(n)

class Solution {
    public boolean isBalanced(TreeNode root) {
        return high(root)>=0;
    }

    public int high(TreeNode root){
        if(root == null) return 0;
        int leftHeight ;
        int rightHeight;
        if((leftHeight =high(root.left)) == -1|| (rightHeight =high(root.right))== -1 || Math.abs(leftHeight-rightHeight)>1){
            return -1;
        }
        return Math.max(leftHeight,rightHeight)+1;
    }
}
posted @ 2022-04-24 16:36  州牧  阅读(28)  评论(0)    收藏  举报