您的位置:首页 > 理论基础 > 数据结构算法

数据结构面试题/判断一棵二叉树是否是平衡二叉树

2017-07-27 23:24 246 查看
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树。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: