跃迁引擎

空気を読んだ雨降らないでよ

iOS Research & Development


平衡二叉树

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

题目

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过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

限制:

1 <= 树的结点个数 <= 10000

解题

思路很简单,只要分别递归出左右子树节点的深度,来判断差异是否大于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
29
30
31
32
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
// 根节点为空,则无子树,也无子节点,深度不可能大于1,则平衡
if (root == null) {
return true;
}
// 子树左右节点深度相减的绝对值大于1,则不平衡
if (Math.abs(maxDepth(root.left) - maxDepth(root.right)) > 1) {
return false;
}
// 子树左右节点都平衡,则平衡
// 递归下去,只要子树左右节点深度相差不大于1,那么都会最终走到空节点处,都会为true,也就表示平衡
return isBalanced(root.left) && isBalanced(root.right);
}

private int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
// 子树的左右节点是否平衡,从底向上最终会返回左右节点各自的深度
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
}
最近的文章

二叉树的深度

剑指 Offer 55 - I. 二叉树的深度 …

, , 开始阅读
更早的文章

种花问题

题目出自 LeetCode 605 - 种花问题 …

, 开始阅读
comments powered by Disqus