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 : lefthight;
return abs(righthight - lefthight) < 2;
}
這種解法是由下向上的進行的,先求出子樹的高度,然后每向上一層子樹高度加一並且判斷一次二叉樹是否平衡,如果平衡返回值為真再繼續判斷,為假則二叉樹不是平衡二叉樹。這種方法代碼沒有遞歸的代碼直觀但是時間復雜度降低了。