数据结构:平衡二叉树(AVL树)

#include <iostream>
using namespace std;

#define EH 0 //等高
#define LH 1 //左高
#define RH -1 //右高
typedef struct TNode
{
	int data;
	int bf;
	struct TNode* lchild;
	struct TNode* rchild;
}BiTree;

void L_Rotate( BiTree*& T )//左旋
{
	BiTree* p = T->rchild;
	T->rchild = p->lchild;
	p->lchild = T;
	T = p;
}
void R_Rotate( BiTree*& T )//右旋
{
	BiTree* p = T->lchild;
	T->lchild = p->rchild;
	p->rchild = T;
	T = p;
}

void LeafBalance( BiTree*& T )//左平衡处理
{
	BiTree* L = T->lchild;
	switch( L->bf )
	{
	case LH:
		T->bf = EH;
		L->bf = EH;
		R_Rotate( T );
		break;
	case RH:
		BiTree* Lr = L->rchild;
		switch( Lr->bf )
		{
		case EH:
			T->bf = EH;
			L->bf = EH;
			break;
		case LH:
			T->bf = RH;
			L->bf = EH;
			break;
		case RH:
			T->bf = EH;
			L->bf = LH;
			break;
		}
		Lr->bf = EH;
		L_Rotate( T->rchild ); //先左旋
		R_Rotate( T );//再右旋
		break;
	}
}

void RightBalance( BiTree*& T )//右平衡处理
{
	BiTree* L = T->rchild;
	switch( L->bf )
	{
	case RH:
		T->bf = EH;
		L->bf = EH;
		L_Rotate( T );
		break;
	case LH:
		BiTree* Ll = L->lchild;
		switch( Ll->bf )
		{
		case EH:
			T->bf = EH;
			L->bf = EH;
			break;
		case LH:
			T->bf = EH;
			L->bf = RH;
			break;
		case RH:
			T->bf = LH;
			L->bf = EH;
			break;
		}
		Ll->bf = EH;
		R_Rotate( T->rchild ); //先右旋
		L_Rotate( T );//再左旋
		break;
	}
}


bool InsertAVL( BiTree*& T, int key, bool& taller )
{
	if ( !T )
	{
		//插入新结点,树长高,置taller为true
		T = new BiTree;
		memset( T, 0, sizeof(BiTree) );
		T->data = key;
		T->bf = EH;
		taller = true;
	}
	else
	{
		if ( key == T->data )
		{
			//树中已存在和key相同关键字的结点则不再插入
			taller = false;
			return false;
		}
		if ( key < T->data )
		{
			//继续在左子树下搜索
			if ( !InsertAVL( T->lchild, key, taller ) )
				return false;
			if ( taller )
			{
				//已插入到T的左子树中且左子树长高
				switch( T->bf )
				{
				case EH://原本左右子树等高,现因左子树长高而树升高
					T->bf = LH;
					taller = true;
					break;
				case RH://原本右子树高,现在等高了
					T->bf = EH;
					taller = false;
					break;
				case LH://原本左子树高,现在失去平衡了,需做左平衡处理
					LeafBalance( T );
					taller = false;
					break;
				}
			}
		}
		else
		{
			//继续在右子树下搜索
			if ( !InsertAVL( T->rchild, key, taller ) )
				return false;
			if ( taller )
			{
				//已插入到T的右子树中且右子树长高
				switch( T->bf )
				{
				case EH://原本左右子树等高,现因右子树长高而树升高
					T->bf = RH;
					taller = true;
					break;
				case LH://原本左子树高,现在等高了
					T->bf = EH;
					taller = false;
					break;
				case RH://原本右子树高,现在失去平衡了,需做右平衡处理
					RightBalance( T );
					taller = false;
					break;
				}
			}
		}
	}
	return true;
}

void PrintBiTree( const BiTree*const& T )
{
	if ( T )
	{
		PrintBiTree( T->lchild );
		cout << T->data << " ";
		PrintBiTree( T->rchild );
	}
}

int main()
{
	int a[10] = {3, 2, 1, 4, 5, 6, 7, 10, 9, 8};
	BiTree* T = NULL;
	bool taller = false;
	for ( int i = 0; i < 10; ++i )
	{
		InsertAVL( T, a[i], taller );
	}

	PrintBiTree( T );
	cout << endl;

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值