判断该树是不是平衡树
1. 递归
- 空间复杂度:深度 log2N(表示log以2为底N的对数)
- 时间复杂度:O(n^2)
(递归的次数*每次递归的次数) 每个节点的遍历*高度(也是遍历整个树)
代码:
bool IsBalance()
{
int depth = 0;
return _IsBalance(_root);
}
int MaxDepth(Node* root)
{
if (NULL == root)
return 0;
int left = MaxDepth(root->_left)+1;
int right = MaxDepth(root->_right) + 1;
return left > right ? left : right;
}
bool _IsBalance(Node* root)
{
//递归的终止条件
if(root == NULL)
{
return true;
}
int leftHeight = MaxDepth(root->_left);
int rightHeight = MaxDepth(root->_right);
return abs(rightHeight-leftHeight) < 2
&& _IsBalance(root->_left)
&& _IsBalance(root->_right);
}
2.优化
- 空间复杂度:深度 log2N(表示log以2为底N的对数)
- 时间复杂度:O(n)
主要思想:高度每次重复遍历,从叶子节点开始判断是否为平衡树,然后统计其高度,这样到了根,就证明该树是平衡树。
//2. 优化——时间复杂度O(n)——高度只遍历一次
bool IsBalance()
{
int depth = 0;
return _IsBalance(_root,depth);
}
bool _IsBalance(Node* root,int& depth)
{
if(root == NULL)
{
return true;
}
int left = 0;
int right = 0;
if(_IsBalance(root->_left,left)&&_IsBalance(root->_right,right))
{
if( abs(left-right) > 1 )
return false;
depth = (left > right ? left : right)+1;
return true;
}
return false;
}
OJ下实现平衡二叉树
class Solution {
public:
bool IsBalanced(TreeNode* root,int& depth){
if(root == NULL){
return true;
}
int left = 0;
int right = 0;
if(IsBalanced(root->left,left)&&IsBalanced(root->right,right)){
if( abs(left-right) > 1 )
return false;
depth = (left > right ? left : right)+1;
return true;
}
return false;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
int depth = 0;
return IsBalanced(pRoot,depth);
}
};