AVL树概念:如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有N个结点,其高度可保持在O(lgn),平均搜索时间复杂度O(lg(n)).
一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:
1.它的左右子树都是AVL树;
2.左子树和右子树高度之差(简称平衡因子)的绝对值不超过1.
先定义一个二叉树的结构体:
template<class K, class V> //键值队
struct AVLTreeNode
{
AVLTreeNode(const K& key, const V& value)
: _pLeft(NULL)
, _pRight(NULL)
, _pParent(NULL)
, _key(key)
, _value(value)
, _bf(0)
{}
AVLTreeNode<K, V>* _pLeft;
AVLTreeNode<K, V>* _pRight;
AVLTreeNode<K, V>* _pParent; //结点的双亲
K _key;
V _value;
int _bf; //平衡因子--检测树的平衡
};
判断下面一棵二叉树是否是平衡二叉树:
根据左右子树的深度判断是否是AVL树(即平衡二叉树),递归实现
bool IsBalanceTree()
{
return _IsBalanceTree(_pRoot);
}
//判断一棵树是否是平衡二叉树--每个结点的平衡因子
bool _IsBalanceTree(Node* pRoot)
{
//前序 -- 空树
if (NULL == pRoot)
return true;
//检测根的平衡
size_t leftHeight = _Height(pRoot->_pLeft);
size_t rightHeight = _Height(pRoot->_pRight);
if (rightHeight - leftHeight != pRoot->_bf || abs(pRoot->_bf) > 1)
{
cout << pRoot->_key << "-->_bf=" << pRoot->_bf << endl;
return false;
}
return _IsBalanceTree(pRoot->_pLeft) && _IsBalanceTree(pRoot->_pRight);
}
size_t _Height(Node* pRoot)
{
if (NULL == pRoot)
return 0;
if (NULL == pRoot->_pLeft && NULL == pRoot->_pRight)
return 1;
size_t leftHeight = _Height(pRoot->_pLeft);
size_t rightHeight = _Height(pRoot->_pRight);
return (rightHeight - leftHeight);
}
结果是:
这棵树不是AVL树。