[路飞]_110. 平衡二叉树

138 阅读2分钟

题目地址
给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过1,则二叉树是平衡二叉树。根据定义,一颗二叉树是平衡二叉树,当且仅当其所有子树叶都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。 示例 1:

image.png

输入: root = [3,9,20,null,null,15,7]
输出: true

示例 2:

image.png

输入: 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