平衡二叉树(AVL树)-详解平衡调整

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平衡二叉树(AVL树)-详解平衡调整相关的知识,希望对你有一定的参考价值。

平衡调整:
(注意:平衡调整只是平衡调整,没有进行结点的插入)

LL型调整:
(带阴影的小框表示插入的结点)
在这里插入图片描述
代码如下:

AVLNode *AVLTree::LL_Rotate(AVLNode *a)
{
	AVLNode *b;
	b = a->lchild;
	a->lchild = b->rchild;
	b->rchild = a;
	a->bf = b->bf = 0;
	return b;
}

RR型调整:
(带阴影的小框表示插入的结点)
在这里插入图片描述
代码如下:

AVLNode *AVLTree::RR_Rotate(AVLNode *a)
{
	AVLNode *b;
	b = a->rchild;
	a->rchild = b->lchild;
	b->lchild = a;
	a->bf = b->bf = 0;
	return b;
}

LR型调整:
(带阴影的小框表示插入的结点)
在这里插入图片描述

情况一:
(C为新插入的结点)

在这里插入图片描述

情况二:
(F为新插入的结点)
在这里插入图片描述
情况三:
(F为新插入的结点)
在这里插入图片描述

代码如下:

AVLNode *AVLTree::LR_Rotate(AVLNode *a)
{
	AVLNode *b, *c;
	b = a->lchild;
	c = b->rchild;
	a->lchild = c->rchild;
	b->rchild = c->lchild;
	c->lchild = b;
	c->rchild = a;
	if (c->bf == 1)//情况二
	{
		a->bf = -1;
		b->bf = 0;
	}
	else if (c->bf == -1)//情况三
	{
		a->bf = 0;
		b->bf = 1;
	}
	else//情况一
	{
		a->bf = b->bf = 0;
	}
	c->bf = 0;
	return c;
}

RL型调整:
(带阴影的小框表示插入的结点)
在这里插入图片描述

情况一:
(C为新插入的结点)
在这里插入图片描述

情况二:
(F为新插入的结点)
在这里插入图片描述
情况三:
(F为新插入的结点)
在这里插入图片描述
代码如下:

AVLNode *AVLTree::RL_Rotate(AVLNode *a)
{
	AVLNode *b, *c;
	b = a->rchild;
	c = b->lchild;
	a->rchild = c->lchild;
	b->lchild = c->rchild;
	c->lchild = a;
	c->rchild = b;
	if (c->bf == 1)//情况二
	{
		a->bf = 0;
		b->bf = -1;
	}
	else if (c->bf == -1)//情况三
	{
		a->bf = 1;
		b->bf = 0;
	}
	else//情况一
	{
		a->bf = b->bf = 0;
	}
	c->bf = 0;
	return c;
}

以上是关于平衡二叉树(AVL树)-详解平衡调整的主要内容,如果未能解决你的问题,请参考以下文章

平衡二叉树AVL树定义插入以及调整最小不平衡子树(C语言)

什么是《平衡二叉树》

详解AVL树(平衡二叉树)

详解AVL树(平衡二叉树)

详解AVL树(平衡二叉树)

平衡二叉树 AVL树结构详解 [Java实现]