请勿第一时间看答案,先自己思考,思考不出来,再看答案

思考题:平衡二叉树判断

题目描述

给定一个二叉树,判断它是否是平衡二叉树.

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

例如下面三个图例,前两个是平衡二叉树,最后一个不是平衡二叉树。

平衡

平衡

不平衡

原题地址:leetcode 110

目前优先使用递归的思路来解答,如果对递归非常熟练,也可以使用其他新的思维来解答

解题思路

前面一个题,我们知道了如何去计算一个二叉树的最大深度,因此,如果我们要判断一棵树是否平衡,只需要利用上一题的结果,然后判断左右两个节点的深度差不超过 1 即可

我们先把上一题的答案拷贝过来

1
export function maxDepth(root: TreeNode | null): number {
2
if (root === null) {
3
return 0
4
}
5
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1
6
};

然后通过判断一个节点的深度差即可

1
export function isBalanced(root: TreeNode | null): boolean {
2
if (root === null) {
3
return true
4
}
5
const leftDepth = maxDepth(root.left)
6
const rightDepth = maxDepth(root.right)
7
8
return Math.abs(leftDepth - rightDepth) <= 1
9
}

不过我们还要注意一个细节,那就是,如果子树不平衡,那么整棵树也是不平衡的。因此,我们还需要递归的去判断子树是否平衡。

return Math.abs(leftDepth - rightDepth) <= 1 && isBalanced(root.left) && isBalanced(root.right)

完整代码如下

answer.ts
1
class TreeNode {
2
val: number
3
left: TreeNode | null
4
right: TreeNode | null
5
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
6
this.val = (val===undefined ? 0 : val)
7
this.left = (left===undefined ? null : left)
8
this.right = (right===undefined ? null : right)
9
}
10
}
11
12
function maxDepth(root: TreeNode | null): number {
13
if (root === null) {
14
return 0
15
}
16
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1
17
};
18
19
export function isBalanced(root: TreeNode | null): boolean {
20
if (root === null) {
21
return true
22
}
23
const leftDepth = maxDepth(root.left)
24
const rightDepth = maxDepth(root.right)
25
26
return Math.abs(leftDepth - rightDepth) <= 1 && isBalanced(root.left) && isBalanced(root.right)
27
}
28
专栏首页
到顶
专栏目录