输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
思路
平衡二叉树中每个节点的平衡因子只有三种可能:-1,0,1。遍历二叉树,只要有一个节点的平衡因子不是-1,0,1则二叉树的不是平衡二叉树,否则就是。比较直观的思路就是计算每个节点的左右子树的高度,然后看是否平衡。但是这样,时间复杂度为O(n2),节点被重复遍历了。可以一遍遍历一遍统计,可以用遍历时,统计节点的高度,如果是不平衡的节点,设置其高度为-1,否则就是正常高度值。
代码
class Solution {
public:
int height(TreeNode* root) {
if(root == nullptr) {
return 0;
}
int left = height(root->left);
int right = height(root->right);
if(left == -1 || right == -1 || abs(left-right) > 1) {
return -1;
}
return max(left,right) + 1;
}
bool isBalanced(TreeNode* root) {
return height(root) >= 0;
}
};