【LeetCode】110. 平衡二叉树

89 阅读1分钟

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

题目

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

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

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

提示

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

题解

思路

判断是不是高度平衡的二叉树,可直接由定义出发。定义表明对于每一个节点皆要满足其左右子树的最大高度差不大于1。就可以抽离出子问题:判断当前节点左右子树高度差是不是大于1. 通过递归来实现。

  1. 子问题:对于当前节点,判断其左右子树高度差,是否大于1.
  2. 确定参数及返回值:由子问题我们可以看出,在每一子问题中,我们需要节点左右子树的高度,来判断是否是高度平衡的二叉树。因此可以确定,参数除了根节点外,还需要在递归的过程中维护每棵树的高度信息。返回值返回的就是以当前节点为根节点的树是否为平衡二叉树。
  3. 递归终止条件:当节点为NULL时,此时返回true
  4. 本层做什么:
    • 判断以左右儿子为根节点的树是不是平衡二叉树,不是直接返回false
    • 通过左右子树高度值更新以当前节点为根节点的树的高度
    • 通过左右子树高度的差值是不是大于1,来判断以当前节点为根节点的树是不是平衡二叉树

代码

class Solution {
public:
    bool isBalanced(TreeNode* root) {
        int h = 0;
        return dfs(root, h);
    }

    bool dfs(TreeNode* root, int& height)
    {
        if (!root) return true;

        int l = 0, r = 0;
        if (!dfs(root->left, l)) return false;
        if (!dfs(root->right, r)) return false;

        height = max(l, r) + 1;
        if (abs(l - r) > 1) return false;
        return true;
    }
};

结语

业精于勤,荒于嬉;行成于思,毁于随。