剑指 Offer 55 - II. 平衡二叉树

110. 平衡二叉树

题目描述

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。

如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

输入输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true

给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false

基本思路

方法一(从上到下递归):

  • 三个与:

    1. 当前子树是否平衡

    2. 当前子树的左子树是否平衡

    3. 当前子树的右子树是否平衡

方法二(从下到上递归 时复更小 因为剪枝了):

jianzhi_55.png

java实现

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
29
30
31
32
33
34
35
36
37
38
39
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/

//方法一 时复O(n^2)空复O(n)
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
return Math.abs(depth(root.left) - depth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
}

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

//方法二 时复O(n)空复O(n)
class Solution {
public boolean isBalanced(TreeNode root) {
//不等于-1说明平衡
return recur(root) != -1;
}

public int recur(TreeNode root){
if(root == null) return 0;
int left = recur(root.left);
if(left == -1) return -1;
int right = recur(root.right);
if(right == -1) return -1;
return Math.abs(left-right) <= 1 ? Math.max(left, right)+1 : -1;
}
}