平衡树是每一颗节点的左右子树高度差不超过1的。
思路:只需要将右子树的高度减去左子树的高度的绝对值不超过2,就是一颗平衡树。
代码:
1.普通版本,时间复杂度为O(N^2)
bool _IsBalance(Node* root)
{
if(root==NULL)
return true;
int LeftHeight=_Height(root->_left );
int RightHeight=_Height(root->_right );
return abs(RightHeight-LeftHeight)<2&&_IsBalance(root->_left )
&&_IsBalance(root->_right );
}
int _Height(Node* root)
{
if(root==NULL)
return 0;
int LeftH=_Height(root->_left );
int RightH=_Height(root->_right );
return LeftH>RightH?LeftH+1:RightH+1;
}
这样我们就会发现,一直在重复计算树的高度。
2.优化的版本,时间复杂度为O(N)
bool _IsBalanceOp(Node* root,int& Height)
{
int LeftHeight=0;
int RightHeight=0;
if(root==NULL)
{
return true;
Height=0;
}
if(_IsBalanceOp(root->_left, LeftHeight)==false) //左子树
return false;
if(_IsBalanceOp(root->_right, RightHeight)==false) //右子树
return false;
Height=RightHeight>LeftHeight?RightHeight+1:LeftHeight+1;
return abs(RightHeight-LeftHeight)<2;
}