Fork me on GitHub

leetcode——[110]BalancedBinaryTree平衡二叉树

题目

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

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

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

示例 1:

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

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

返回 true

示例 2:

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

1
2
3
4
5
6
7
      1
/ \
2 2
/ \
3 3
/ \
4 4

返回 false

Given a binary tree, determine if it is height-balanced.

For this problem, a height-balanced binary tree is defined as:

a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example 1:

Given the following tree [3,9,20,null,null,15,7]:

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

Return true.

Example 2:

Given the following tree [1,2,2,3,3,null,null,4,4]:

1
2
3
4
5
6
7
      1
/ \
2 2
/ \
3 3
/ \
4 4

Return false.

解题方法

递归

计算左、右子树的深度,如果深度差大于1,则不为平衡二叉树;否则递归判断左、右子树是否是平衡二叉树。这段代码跑了4ms,超过了22.22%的Java提交。这段递归的效率非常低,重复计算了很多次子树的深度,进行了多轮递归,还有很大的优化空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution{
// Method 1 4ms 22.22%
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
if (Math.abs(countDeep(root.left) - countDeep(root.right)) > 1) {
return false;
}
else {
return isBalanced(root.left) && isBalanced(root.right);
}
}

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

使用一个全局变量,保存二叉树是否是平衡的状态。递归计算左右子树的深度,如果深度差大于1则修改状态。只需要进行一轮递归,这段代码跑了2ms,超过了92.98%的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
class Solution{
//Method 2 2ms 92.98%
boolean res = true;

public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
countDeep(root);
return res;
}

public int countDeep(TreeNode root) {
if (!res) {
return -1;
}
if (root == null) {
return 0;
}
int left = countDeep(root.left);
int right = countDeep(root.right);
if (Math.abs(left - right) > 1) {
res = false;
}
return 1+Math.max(left, right);
}
}
BJTU-HXS wechat
海内存知己,天涯若比邻。