版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ClamReason/article/details/84038008
平衡二叉树是高度平衡的二叉树:
1 左右子树的高度差最多为1.
2 主要的实现地方是插入平衡和删除平衡。
3 为了实现平衡,每个节点保存了一个高度h成员。
4 当插入和删除破坏了平衡的时候需要进行旋转;
5 根据左右子树高度差的不同进行四中不同的旋转:左左、右右、左右、右左
百度云下载sln文件:https://pan.baidu.com/s/1pxPGQDYhbcG-E6sE26WfuA
下面是插入和删除的核心代码:
插入:
//Insert
void CAVLTree::InsertPri(CTreeNode*& _pNode, CTreeNode*& _pParentNode, const int _key, const CEntry& _entry)
{
if (_pNode == nullptr)//如果节点为空,就在此节点处加入_entry信息
{
//Counter::AddCount(CounterType::AVLInsert);
_pNode = new CTreeNode();
_pNode->key = _key;
_pNode->value = _entry;
_pNode->parent = _pParentNode;
CTreeNode::UpdateParentHeight(_pNode);
return;
}
if (_pNode->value < _entry)
{
//Counter::AddCount(CounterType::AVLInsert);
InsertPri(_pNode->rchild, _pNode, _key, _entry);
int rHight = CTreeNode::GetHeight(_pNode->rchild);
int lHight = CTreeNode::GetHeight(_pNode->lchild);
int height = std::max(lHight, rHight) - std::min(lHight, rHight);
if (2 == height)
{
if (_entry >= _pNode->rchild->value)//尽量使用单旋转==
{
RightRightRotate(_pNode);
}
else
{
DoubleRotateRL(_pNode);
}
}
}
else if (_entry < _pNode->value)//如果_entry小于节点的值,就继续在节点的左子树中插入_entry
{
//Counter::AddCount(CounterType::AVLInsert);
InsertPri(_pNode->lchild, _pNode, _key, _entry);
int rHight = CTreeNode::GetHeight(_pNode->rchild);
int lHight = CTreeNode::GetHeight(_pNode->lchild);
int height = std::max(lHight, rHight) - std::min(lHight, rHight);
if (2 == height)
{
if (_entry <= _pNode->lchild->value)//尽量使用单旋转==
{
LeftLeftRotate(_pNode);
}
else
{
DoubleRotateLR(_pNode);
}
}
}
}
删除:
void CAVLTree::DeletePri(CTreeNode* &_pNode, const CEntry& _entry)
{
if (_pNode == nullptr)
{
return;
}
if (_entry < _pNode->value)
{
DeletePri(_pNode->lchild, _entry);
int rHight = CTreeNode::GetHeight(_pNode->rchild);
int lHight = CTreeNode::GetHeight(_pNode->lchild);
int height = std::max(lHight, rHight) - std::min(lHight, rHight);
if (2 == height)
{
if (_pNode->rchild->lchild != nullptr && _pNode->rchild->lchild->height > _pNode->rchild->rchild->height)
{
DoubleRotateRL(_pNode);
}
else
{
RightRightRotate(_pNode);
}
}
}
else if (_entry > _pNode->value)
{
DeletePri(_pNode->rchild, _entry);
int rHight = CTreeNode::GetHeight(_pNode->rchild);
int lHight = CTreeNode::GetHeight(_pNode->lchild);
int height = std::max(lHight, rHight) - std::min(lHight, rHight);
if (2 == height)
{
if (_pNode->lchild->rchild != nullptr && (_pNode->lchild->rchild->height > _pNode->lchild->lchild->height))
{
DoubleRotateLR(_pNode);
}
else
{
LeftLeftRotate(_pNode);
}
}
}
else
{
if (_pNode->lchild&&_pNode->rchild)//this node has two childs
{
CTreeNode* temp = _pNode->rchild;
while (temp->lchild != nullptr)
{
temp = temp->lchild;//find min in rchild
}
_pNode->value = temp->value;
DeletePri(_pNode->rchild, temp->value);
int rHight = CTreeNode::GetHeight(_pNode->rchild);
int lHight = CTreeNode::GetHeight(_pNode->lchild);
int height = std::max(lHight, rHight) - std::min(lHight, rHight);
if (2 == height)
{
if (_pNode->lchild->rchild != nullptr && (_pNode->lchild->rchild->height > _pNode->lchild->lchild->height))
{
DoubleRotateLR(_pNode);
}
else
{
LeftLeftRotate(_pNode);
}
}
}
else//this node has 1 or 0 child
{
CTreeNode* temp = _pNode;
if (_pNode->lchild == nullptr)
{
_pNode = _pNode->rchild;
}
else if (_pNode->rchild == nullptr)
{
_pNode = _pNode->lchild;
}
delete(temp);
temp = nullptr;
}
}
if (_pNode == nullptr)
{
return;
}
return;
}
输出: