给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7
返回 true
。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1 / \ 2 2 / \ 3 3 / \ 4 4
返回 false
。
思路:
由于平衡二叉树的定义每个节点的左右子树的深度差不超过1,所以直观想法我们可以在前序遍历的同时每次调用求深度的递归代码,但是这样父节点与子节点调用的递归求深度代码有重叠,造成时间的巨大开销。所以我们想其他方法来解决。
观察到如果我们用后序遍历(左-右-根)来遍历二叉树,并且每次保存中间变量cur来记录树的深度,这样可以避免重复遍历节点,因为当访问到根节点时,他的左右子树已经被访问过了,并且记录树深度的cur已经更新,我们判断左右子树返回的cur的差是否在-1~1之间,可以作为当前节点是否平衡的依据。
//注意传入的cur是引用,这样可以方便在子函数中修改主函数传入的cur
bool isBalancesCore(TreeNode* root,int &cur) {
if (root == nullptr) {
//到达边界条件时做两件事,cur赋值为0,返回true
cur = 0;
return true;
}
int left, right;
//返回左右子树情况
bool left_=isBalancesCore(root->left, left);
bool right_=isBalancesCore(root->right, right);
int diff = left - right;
//根据左右子树返回的cur和bool类型值做综合判断
if (diff < -1 || diff>1 || !left_ || !right) {
return false;
}
//更新根节点的cur值,返回给父节点
cur = max(left, right) + 1;
return true;
}
bool isBalanced(TreeNode* root) {
if (!root) {
return true;
}
int cur = 0;
return isBalancesCore(root,cur);
}