[路飞]_LeetCode_110. 平衡二叉树

113 阅读1分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

题目

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

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

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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

提示:

树中的节点数在范围 [0, 5000] 内
-104 <= Node.val <= 104

来源:力扣(LeetCode)leetcode-cn.com/problems/ba…

解题思路

  1. 设计递归函数,获取树的高度,树高等于左子树和右子树中高度大的一个加 1,即 Math.max(l, r) + 1
  2. 给这个函数一个另外的意义,当左子树和右子树的绝对值大于 1 时,代表不是平衡二叉树,并且返回 -1;
  3. 当左子树或右子树不平衡时,当前树也不是平衡二叉树;

调用递归函数获取树高,如果树高大于等于 0,则是平衡二叉树。

代码实现

var isBalanced = function(root) {
    //如果树高小于 0,则不是平衡二叉树
    return getHeight(root) >= 0
};

//获取一棵树的高度
var getHeight = function(root) {
    //如果根节点为空则树的高度为0
    if (!root) return 0

    //获取树的左子树的高度
    const l = getHeight(root.left)
    //获取树的右子树的高度
    const r = getHeight(root.right)
    
    //如果左子树或者右子树的不是平衡二叉树,则当前节点也不是平衡二叉树
    if (l < 0 || r < 0) return -1
    
    //如果左子树和右子树的绝对值大于1,则说明不平衡了,返回 -1
    if (Math.abs(l - r) > 1) return -1

    //左子树和右子树中高度大的一个加 1,则是当前树的高度
    return Math.max(l, r) + 1
}

如有错误欢迎指出,欢迎一起讨论!