题目描述
实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false 。
示例 3:
以下二叉树跟节点3平衡,但是左子树9不平衡;
3
/ \
9 20
/ / \
4 15 7
/ \
10 8
返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-balance-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 根据平衡性的定义,计算每个节点的左右子树高度。
- 如果某个节点的左右子树高度差大于1,则不平衡,返回false,算法结束;
- 否则说明以当前节点为根的子树是平衡的,继续检查当前节点的左右子树的平衡性。
计算二叉树的高度:
递归,分解问题;
- 当前二叉树的高度 = max(左子树高度,右子树高度) + 1
- 左子树高度的计算方法和第1步相同
- 若当前节点为null,返回0,作为递归出口
按照以上分解方法可以到达递归出口
代码
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function isBalanced(root: TreeNode | null): boolean {
if(root==null){
return true;
}
let leftTreeDepth:number=treeDepth(root.left);
let rightTreeDepth:number=treeDepth(root.right);
if(Math.abs(leftTreeDepth-rightTreeDepth)>1){
return false;
}
// 如果当前树节点平衡,则检查左右子树平衡;
return isBalanced(root.left)&&isBalanced(root.right);
};
// 计算树的高度;
function treeDepth(root: TreeNode | null):number{
if(root==null){
return 0;
}
return Math.max(treeDepth(root.left),treeDepth(root.right))+1;
}