判断AVL树是否平衡
AVL树是高度的平衡二插搜索树,其左子树和右子树的高度之差不超过1(树中的左子树和右子树都是AVL树),维持这个高度之差就要控制它的平衡因子。那么判断一颗AVL树是否平衡就需要判断它的左子树和右子树高度差是否为1,并且子树也遵循这个原则。这里我们可以用递归的方法来判断这颗二叉树是否为平衡二叉树,看他的左右子树之差是否不超过1.代码如下:
bool IsBalance(Node* parent)
{
if (parent == NULL)
return true;
int rightHight = _Hight(parent->_right); //右树的高度
int leftHight = _Hight(parent->_left); //左树的高度
return abs(rightHight - leftHight) < 2 && IsBalance(parent->_left) && IsBalance(parent->_right); //判断左右子树绝对值是否小于2并递归
}
求高度的函数如下:
int _Hight(Node* node)
{
if (node == NULL)
return 0;
int right = _Hight(node->_right) + 1;
int left = _Hight(node->_left) + 1;
return right>left ? right : left;
}
这样的代码很容易理解也能到达求AVL树是否平衡但是由于是递归这个解法的时间复杂度比较高。那么有没有时间复杂度更优的解法呢?这里我们采用一种非递归的解法,代码如下:
bool IsBalence()
{
int hight = 0; //高度
return _IsBalece(_root, hight);
}
bool _IsBalence(Node* parent, int &hight)
{
if (parent == NULL)
{
hight = 0;
return true;
}
lefthight = 0;
if (_IsBalence(parent->_left, lefthight) == false)
return false;
righthight=0;
if (_IsBalence(parent->_right, righthight) == false)
return false;
hight = righthight > lefthight ? righthight + 1 : lefthight + 1;
return abs(righthight - lefthight) < 2;
}
这种解法是由下向上的进行的,先求出子树的高度,然后每向上一层子树高度加一并且判断一次二叉树是否平衡,如果平衡返回值为真再继续判断,为假则二叉树不是平衡二叉树。这种方法代码没有递归的代码直观但是时间复杂度降低了。