判断是不是平衡二叉树
1. 问题描述
2. 算法思想
用后序遍历的方法遍历二叉树求,先递归到叶子结点,然后在回溯的过程中来判断是否满足条件。如果不满足平衡二叉树的定义,则返回-1,并且如果左子树不满足条件了,直接返回-1,右子树也是如此,相当于剪枝,加速结束递归。
3. 代码
class Solution {
public:
int depth(TreeNode *root) {
if (!root) return 0;
int l= depth(root->left);
if (l== -1) return -1; //左子树已经不满足了
int r= depth(root->right);
if (r== -1) return -1; //右子树已经不满足了
int sub = abs(l- r); //求高度差
if (sub > 1) return -1;
return max(l, r) + 1;
}
bool IsBalanced_Solution(TreeNode* root) {
return depth(root) != -1;
}
};
4. 时间复杂度分析
时间复杂度:最坏的情况下遍历整个二叉树,为O(N)
空间复杂度:当二叉树退化到链表时,递归深度为N,O(N)