力扣【二叉树专题】 110. 平衡二叉树

115 阅读1分钟

theme: hydrogen

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 3 天,点击查看活动详情

题目链接

110. 平衡二叉树 - 力扣(LeetCode)

题目描述

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

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

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

测试用例

示例 1:

image.png

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

限制

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

题目分析

首先,对树的高度的定义,为:根节点,到最远的叶子节点的距离;子树的高度定义也类似,即为子树根节点到他的最远的叶子节点的距离

题目需要我们判断给定的树,是否为高度平衡的二叉树,即需要以递归的方式,去遍历每一个节点,并同时记录下这个节点的左右子节点的子树高度,然后判断左右子树的高度差的绝对值,是否为 1

因为我们需要知道当前节点的左右子节点的信息,即需要在左右子节点遍历完成后,做一些逻辑判断;即我们需要以后续遍历的方式来处理这一颗树

后序遍历的逻辑为:

  1. 如果当前节点为 null,直接返回 0
  2. 对左右子节点返回的高度值,做 +1 处理
  3. 拿到左右子节点的高度值,后,判断他们的绝对差值
    1. 差值小于、等于 1 则选择其中最大的一个值作为这个节点的高度值
    2. 差值大于 1 则将标记修改并返回
  4. 当遍历的时候,发现已有子节点确认不是平衡二叉树时,直接返回

代码实现

完整的代码实现如下,与常规的递归相比,多了一个返回值

var isBalanced = function(root) {
    let flag = true;
    trave(root);
    return flag;
    function trave(node) {
        if (flag == false) return;
        if (node == null) return 0;
        let lt = trave(node.left) + 1;
        let rt = trave(node.right) + 1;
        if (Math.abs(lt - rt) > 1) {
            flag = false;
        } else {
            return Math.max(lt, rt);
        }
    }
};

image.png