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

前端之家收集整理的这篇文章主要介绍了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,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;
}

猜你在找的数据结构相关文章