持续创作,加速成长!这是我参与「掘金日新计划 · 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.
- 确定参数及返回值:由子问题我们可以看出,在每一子问题中,我们需要节点左右子树的高度,来判断是否是高度平衡的二叉树。因此可以确定,参数除了根节点外,还需要在递归的过程中维护每棵树的高度信息。返回值返回的就是以当前节点为根节点的树是否为平衡二叉树。
- 递归终止条件:当节点为NULL时,此时返回true
- 本层做什么:
- 判断以左右儿子为根节点的树是不是平衡二叉树,不是直接返回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;
}
};
结语
业精于勤,荒于嬉;行成于思,毁于随。