请勿第一时间看答案, 先自己思考, 思考不出来, 再看答案
给定一个二叉树, 判断它是否是平衡二叉树.
平衡二叉树的定义:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1.
例如下面三个图例, 前两个是平衡二叉树, 最后一个不是平衡二叉树.



目前优先使用递归的思路来解答, 如果对递归非常熟练, 也可以使用其他新的思维来解答
前面一个题, 我们知道了如何去计算一个二叉树的最大深度, 因此, 如果我们要判断一棵树是否平衡, 只需要利用上一题的结果, 然后判断左右两个节点的深度差不超过 1 即可
我们先把上一题的答案拷贝过来
1export function maxDepth(root: TreeNode | null): number {2if (root === null) {3return 04}5return Math.max(maxDepth(root.left), maxDepth(root.right)) + 16};
然后通过判断一个节点的深度差即可
1export function isBalanced(root: TreeNode | null): boolean {2if (root === null) {3return true4}5const leftDepth = maxDepth(root.left)6const rightDepth = maxDepth(root.right)78return Math.abs(leftDepth - rightDepth) <= 19}
不过我们还要注意一个细节, 那就是, 如果子树不平衡, 那么整棵树也是不平衡的. 因此, 我们还需要递归的去判断子树是否平衡.
1return Math.abs(leftDepth - rightDepth) <= 1 && isBalanced(root.left) && isBalanced(root.right)
完整代码如下
01class TreeNode {02val: number03left: TreeNode | null04right: TreeNode | null05constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {06this.val = (val===undefined ? 0 : val)07this.left = (left===undefined ? null : left)08this.right = (right===undefined ? null : right)09}10}1112function maxDepth(root: TreeNode | null): number {13if (root === null) {14return 015}16return Math.max(maxDepth(root.left), maxDepth(root.right)) + 117};1819export function isBalanced(root: TreeNode | null): boolean {20if (root === null) {21return true22}23const leftDepth = maxDepth(root.left)24const rightDepth = maxDepth(root.right)2526return Math.abs(leftDepth - rightDepth) <= 1 && isBalanced(root.left) && isBalanced(root.right)27}28