给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
提示:
- 树中的节点数在范围
[0, 5000]内 -104 <= Node.val <= 104
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: true
示例 2:
输入: root = [1,2,2,3,3,null,null,4,4]
输出: false
题解:
/**
* @description: 递归回溯 TC:O(n) SC:O(1)
* @author: JunLiangWang
* @param {*} root 给定树的根节点
* @return {*}
*/
function recursionBackTracking(root){
/**
* 本方案采用递归回溯的方式,对于一棵平衡二叉树而言
* 其任一子树都是平衡二叉树,因此我们可以使用自顶向
* 下逐步递归其子树,直到子树为空,然后返回其树的高
* 度,最后比对左右两子树的高度,如果超过1则不为平衡
* 二叉树。
*/
// 记录结果
let result=true;
/**
* @description: 递归遍历树的所有子树
* @author: JunLiangWang
* @param {*} root 当前子树根节点
* @return {*}
*/
function recursion(root){
// 如果结果已经为false或root为空,直接返回0
if(!result||!root)return 0;
// 获取当前节点左子树高度
let leftNodeHeight=recursion(root.left);
// 获取当前节点右子树高度
let rightNodeHeight=recursion(root.right);
// 如果两树高度差大于1或结果已经为false,直接
// 将result赋值fasle,然后返回0
if(Math.abs(leftNodeHeight-rightNodeHeight)>1||!result){
result=false;
return 0;
}
// 否则证明两树高度差小于等于1,该子树为一棵平衡二叉树
// 返回其最大子树高度+1
return Math.max(leftNodeCount,rightNodeCount)+1;
}
// 执行递归
recursion(root)
// 返回结果
return result;
}