110. 平衡二叉树

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

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

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

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

3 /
9 20 /
15 7 返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

1

/
2 2 /
3 3 /
4 4 返回 false 。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/balanced-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

思路一:

  • 从头节点开始,计算节点高度,所有节点的左右节点高度差 <=1 ,则平衡
  • 否则平衡
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 二叉树层序遍历,求节点高度
    public int height1(TreeNode root){
        if (root == null) return 0;

        int height = 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()){
            int size = queue.size();
            while (size > 0){

                TreeNode node = queue.remove();
                if (node.left != null) queue.add(node.left);
                if (node.right != null) queue.add(node.right);
                size --;
            }

            height ++;
        }
        return height;
    }

    public boolean isBalanced1(TreeNode root) {
        if (root == null) return true;

        boolean isbalance = Math.abs(height(root.left) - height(root.right)) <= 1;
        return isBalanced1(root.left) && isBalanced1(root.right) && isbalance;
    }

思路二:

  • 上述方法中计算height存在大量冗余
  • 每次调用height时,同时计算其子树的高度
  • 但是自底向上计算,每个子树的高度智慧计算一次
  • 可以递归先计算当前节点子节点的高度
  • 然后通过子节点的高度判断当前节点是否平衡
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 思路二:
    // 上述方法计算height存在大量冗余
    // 每次调用height时,同时计算其子树的高度
    // 但是自底向上计算,每个子树的高度只会计算一次
    // 可以递归先计算当前节点子节点高度
    // 然后通过子节点高度判断当前节点是否平衡
    public int height(TreeNode root){
        if (root == null) return 0;

        int l = height(root.left);
        if (l == -1) return -1;

        int r = height(root.right);
        if (r == -1) return -1;

        return Math.abs(r - l) <= 1 ? Math.max(l,r) + 1 : -1;
    }

    public boolean isBalanced(TreeNode root){
        return height(root) != -1;
    }