leetcode110
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
//单独考量每个节点
void helper(TreeNode* root, int& height, int& id) {
//如果当前节点为空,则平衡,且无左右高度
if (root == nullptr) {
height = 0;
return;
}
//当前节点左右初始高度为0
int l = 0, r = 0;
//调用递归,获得当前节点左高度
helper(root->left, l, id);
//调用递归,获得当前节点右高度
helper(root->right, r, id);
//判断当前节点是否平衡
if (abs(l - r) > 1) {
id = 1;
}
//获得上一节点左/右高度
height = 1 + max(l, r);
}
bool isBalanced(TreeNode* root) {
if (root == nullptr) {
return true;
}
//height既是左高度也是右高度
int height = 0;
int id = 0;
helper(root, height, id);
return (id == 0);
}
这是一种自下而上判断平衡的方法,因为肯定是最下面的节点最先跑完递归全程
对代码编号
void helper(TreeNode* root, int& height, int& id) {
①if (root == nullptr) {
height = 0;
return;
}
②int l = 0, r = 0;
③helper(root->left, l, id);
④helper(root->right, r, id);
⑤if (abs(l - r) > 1) {
id = 1;
⑥height = 1 + max(l, r);
}
}
1
2 25
3 35
4 55
以这棵树为例,我们快进到4node进入递归的情景,
①不执行
②l=0,r=0
③传入4node的左侧,但是直接return,h=0,所以4node的l仍为0
④与③同理·,4node的r仍为0
⑤4node平衡
⑥h=1,3node的l=1
3node进入root->right递归,不改变3的r,仍为0
3node平衡,返回h=1+1=2,也就是2的l
2node进入root->right递归,不改变的r,仍为0
2不平衡
这是一种倒序的遍历方法,先从末尾的节点判断,当前节点的r与l都源自于它的叶子结点