题目地址
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过1,则二叉树是平衡二叉树。根据定义,一颗二叉树是平衡二叉树,当且仅当其所有子树叶都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。 示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: true
示例 2:
输入: root = [1,2,2,3,3,null,null,4,4]
输出: false
示例 3:
输入: root = []
输出: true
示例 4:
输入: root = [1,2,2,3,3,null,null,4,4,5,5]
输出: true
后序遍历,自下而上,遍历儿叉树的左右节点
解题思路
我们首先要明确一个原则,如果是失衡的二叉树,那么我们就返回一个负数,如何不是失衡二叉树,那么就返回一个正数。要实现一个二叉树的递归深度,首先去判断当前节点的左右子节点高度分别是多少,然后去判断左右子节点高度的差绝对值是否大于1.大于1就返回一个负数。否则就返回当前节点的左右子节点中深度更高的节点值再加1,然后继续自下向上递归。 递归的基线条件(递归终止条件)是:某个子节点的左右节点的深度差的绝对值大于1,然后返回-2.判断当前节点的深度差为-2了,那么就说明已经是失衡二叉树了,递归结束。否则一直递归到根节点,并返回整棵树的深度。
代码实现
var isBalanced = function(root){
// 根据递归返回值得正负数来判断二叉树是否失衡
return dfs(root) >= 0;
}
var dfs = function(root){
// 判断当前是否是空树,为空直接返回false
if(!root) return false;
// 遍历树的左节点的深度
// 示例4可以打印console.log('root.left', dfs(root.left)),结果返回-2,递归结束
let l = dfs(root.left);
// 遍历树的右节点的深度
let r = dfs(root.right);
// **说明:-2没有实际意义,只是单纯表示失衡就返回一个负数,可以定义任意负数**
// 如果某个节点的左右节点的深度差大于1,那么就会返回-2.
// 如果返回了-2就结束递归,说明已经是失衡二叉树
if(l === -2 || r === -2) return -2;
// 判断左右节点的深度差,大于1,就返回-2
if(Math.abs(l - r) > 1){
return -2
}
return Math.max(l, r) +1