AVL树-平衡二叉树

平衡二叉树是高度平衡的二叉树:

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;
}

输出:

《AVL树-平衡二叉树》

    原文作者:AVL树
    原文地址: https://blog.csdn.net/calmreason/article/details/84038008
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞