AVL的构建(插入操作)---《数据结构》严蔚敏

// exam1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

#define LH -1
#define EH 0
#define RH 1

typedef struct BSTNode
{
	int data;
	int bf;
	struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

void R_Rotate(BSTree &p)
{
	BSTree lc;

	lc=p->lchild;
	p->lchild=lc->rchild;
	lc->rchild=p;
	p=lc;

	return;
}

void L_Rotate(BSTree &p)
{
	BSTree rc;

	rc=p->rchild;
	p->rchild=rc->lchild;
	rc->lchild=p;
	p=rc;

	return;
}

void LeftBalance(BSTree &T)
{
	BSTree lc;
	lc=T->lchild;

	switch(lc->bf)
	{
		case LH:
			T->bf=EH;
			lc->bf=EH;
			R_Rotate(T);
			break;
		case RH:
			BSTree rd;
			rd=lc->rchild;
			switch(rd->bf)
			{
				case LH:
					T->bf=RH;
					lc->bf=EH;
					break;
				case EH:
					T->bf=lc->bf=EH;
					break;
				case RH:
					lc->bf=LH;
					T->bf=EH;
					break;
			}
			rd->bf=EH;
			L_Rotate(lc);
			R_Rotate(T);
	}
}

void RightBalance(BSTree &T)
{
	BSTree rc;

	rc=T->rchild;
	switch(rc->bf)
	{
		case RH:
			T->bf=EH;
			rc->bf=EH;
			L_Rotate(T);
			break;
		case LH:
			BSTree ld;
			ld=rc->lchild;
			switch(ld->bf)
			{
				case LH:
					T->bf=EH;
					rc->bf=RH;
					break;
				case EH:
					T->bf=rc->bf=EH;
					break;
				case RH:
					T->bf=LH;
					rc->bf=EH;
					break;
			}
			ld->bf=EH;
			R_Rotate(rc);
			L_Rotate(T);
	}
}

int InsertAVL(BSTree &T,int e,bool &taller)
{
	if(!T)
	{
		T=(BSTree)malloc(sizeof(BSTNode));
		T->data=e;
		T->lchild=NULL;
		T->rchild=NULL;
		T->bf=0;
		taller=true;
	}
	else
	{
		if(T->data==e)
		{
			taller=false;
			return 0;
		}
		if(T->data>e)
		{
			if(!InsertAVL(T->lchild,e,taller))
			{
				taller=false;
				return 0;
			}

			if(taller)
			{
				switch(T->bf)
				{
					case LH:
						LeftBalance(T);
						taller=false;
						break;
					case EH:
						taller=true;
						T->bf=LH;
						break;
					case RH:
						taller=false;
						T->bf=EH;
						break;
				}
			}
		}
		else
		{
			if(!InsertAVL(T->rchild,e,taller))
			{
				taller=false;
				return 0;
			}
			if(taller)
			{
				switch(T->bf)
				{
					case LH:
						T->bf=EH;
						taller=false;
						break;
					case EH:
						T->bf=RH;
						taller=true;
						break;
					case RH:
						RightBalance(T);
						taller=false;
						break;
				}
			}
		}
	}

	return 1;
}

void InorderTraversal(BSTree node)
{
	if(!node)
	{
		return;
	}
	else
	{
		InorderTraversal(node->lchild);
		cout<<node->data<<" ";
		InorderTraversal(node->rchild);
	}
	return;
}

int main(void)
{
	int node;
	bool flag=false;
	BSTree T=NULL;

	cout<<"Please enter nodes of the BSTree..."<<endl;
	cout<<"Note:end with \"ctrl+z\""<<endl;
	while(cin>>node)
	{
		InsertAVL(T,node,flag);
	}
	cout<<"Build binary search tree OK!"<<endl;

	cout<<"The Inorder traversal sequence of the BSTree is:"<<endl;
	InorderTraversal(T);
	cout<<endl;

	system("pause");
	return 0;
}

AVL的构建(插入操作)---《数据结构》严蔚敏,布布扣,bubuko.com

时间: 2024-10-24 08:45:49

AVL的构建(插入操作)---《数据结构》严蔚敏的相关文章

AVL树的插入操作(旋转)图解

=================================================================== AVL树的概念 在说AVL树的概念之前,我们需要清楚二茬搜索树的概念.对于二叉搜索树,我们知道它可以降低查找速率,但是如果一个二叉搜索树退化成一棵只剩单支的搜索树,此时的查找速率就相当于顺序表中查找元素,效率变低,时间复杂度由原来的O(logN)变为O(N). 此时就有了AVL(高度平衡二叉搜索树),从它的名字就能知道它也是一棵二叉搜索树,只是它在插入元素的时候

基于c语言数据结构+严蔚敏——线性表章节源码,利用Codeblocks编译通过

白天没屌事,那我们就来玩玩线性表的实现吧,快要失业了,没饭吃了咋整哦 题目描述假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B.这就要求对线性表做如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去.只要从线性表LB中依次取得每个元素,并依值在线性表LA中进行查访,若不存在,则插入之. #ifndef FUNC_H_INCLUDED #define FUNC_H_INCLUDE

[数据结构严蔚敏]线性表-算法2.1

/*algorithm-2.1.c*/ 1 #include<stdio.h> 2 #include<linear_list_ADT.h> 3 4 int main(void){ 5 List LA,LB; 6 int LA_len,LB_len; 7 InitList(&LA); 8 InitList(&LB); 9 /*********get LIST_A***********/ 10 printf("please input length of LA

数据结构(严蔚敏)算法2.3-算法2.4

1 //线性表的插入与删除 2 #include <stdio.h> 3 #include <stdlib.h> 4 #define LIST_INIT_SIZE 100 //线性表存储空间的初试分配量 5 #define LISTINCREMENT 10 //线性表存储空间的分配增量 6 #define ERROR 0 7 #define OK 1 8 typedef struct{ 9 int *elem; //存储空间的基址 10 int length;//当前长度 11 i

AVL树插入操作InsertAVL的实现

AVL树是非常重要的一种数据结构,这里实现了在AVL树中的插入操作,包括插入后整个树的自平衡. 这里有几点值得注意的地方: 1).左旋L_Rotate与右旋R_Rotate操作: 这两个操作传递进来的参数是以TreeNode*&的形式传递进来的,也就是说传递的是指针的引用,效果等价于传递二级指针 如果不加入&,则在函数内部更改的是形参的指向,因为实际上函数调用时,如果不采用引用传递,则会构造一个与原T指向同一个地方的临时变量指针,在X_Rotate的内部也是对这个临时变量进行操作,等到返回

AVL树的插入和删除

一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是 O(log(n)).插入和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡. 节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反).带有平衡因子 1.0 或 -1 的节点被认为是平衡的.带有平衡因子 -2 或 2 的节点被认为是不平衡的,并需要重新平衡这个树.平衡因

数据结构&amp;&amp;AVL树原理、插入操作详解及实现

1.基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级--它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋.下面我们来看看: 2.AVL树是什么? AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是: 1. 本身首先是一棵二叉搜索树. 2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5              5 / \            / \ 2   6          2  

9-7-平衡二叉排序(搜索)树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 平衡二叉排序(搜索)树 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包    

2-2-求并集A=A∪B-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第2章  线性表 - 求并集A=A∪B ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceList.c        相关测试数据下载  链接? 无数