平衡二叉树排序树

平衡二叉树排序树

#include <stdio.h>
#include <stdlib.h>

#define ENDKEY 0

typedef int KeyType;

typedef struct  node
{
	KeyType  key ; /*关键字的值*/
	int bf;      //平衡因子
	struct node  *lchild,*rchild;/*左右指针*/
}AVLTNode, *AVLTree;


void  ins_AVLtree(AVLTree  *avlt ,  KeyType  K)//ins_AVLtree(bst, key);
/*在平衡二叉树中插入元素k,使之成为一棵新的平衡二叉排序树*/
{
	AVLTNode *S;
	AVLTNode *A,*FA,*p,*fp,*B,*C;
	S=(AVLTree)malloc(sizeof(AVLTNode));
	S->key=K; 
	S->lchild=S->rchild=NULL;
	S->bf=0;
	if (*avlt==NULL)  
		*avlt=S;
	else 
	{ 
	/* 首先查找S的插入位置fp,同时记录距S的插入位置最近且
		平衡因子不等于0(等于-1或1)的结点A,A为可能的失衡结点*/
		A=*avlt;  FA=NULL;
		p=*avlt;  fp=NULL;
		while  (p!=NULL)
		{ 
			if (p->bf!=0) 
			{
				A=p; FA =fp;
			}
			fp=p;
			if  (K < p->key)  
				p=p->lchild;
			else  
				p=p->rchild;
		}
		/* 插入S*/
		if (K < fp->key) 
			fp->lchild=S;
		else
			fp->rchild=S;
		/* 确定结点B,并修改A的平衡因子 */
		if (K < A->key)
		{
			B=A->lchild;
			A->bf=A->bf+1;
		}
		else
		{
			B=A->rchild;
			A->bf=A->bf-1;
		}
		/* 修改B到S路径上各结点的平衡因子(原值均为0)*/
		p=B;
		while (p!=S)
		{
			if  (K < p->key)
			{
				p->bf=1;
				p=p->lchild;
			}
			else
			{
				p->bf=-1;
				p=p->rchild;
			}
			/* 判断失衡类型并做相应处理 */
			if  (A->bf==2 && B->bf==1)       /* LL型 */
			{
				B=A->lchild;
				A->lchild=B->rchild;
				B->rchild=A;
				A->bf=0;
				B->bf=0;
				if (FA==NULL) 
					*avlt=B;
				else 
					if (A==FA->lchild) 
						FA->lchild=B;
					else 
						FA->rchild=B;
			}
			else
				if (A->bf==2 && B->bf==-1)       /* LR型 */
				{
					B=A->lchild;
					C=B->rchild;
					B->rchild=C->lchild;
					A->lchild=C->rchild;
					C->lchild=B;
					C->rchild=A;
					if (S->key < C->key)
					{ 
						A->bf=-1;
						B->bf=0;
						C->bf=0;
					}
					else 
						if (S->key >C->key)
						{
							A->bf=0;
							B->bf=1;
							C->bf=0;
						}
						else
						{ 
							A->bf=0;
							B->bf=0;
						}
						if  (FA==NULL) 
							*avlt=C;
						else 
							if (A==FA->lchild) 
								FA->lchild=C;
							else 
								FA->rchild=C;
				}
				else 
					if  (A->bf==-2 && B->bf==1)       /* RL型 */
					{
						B=A->rchild;
						C=B->lchild;
						B->lchild=C->rchild;
						A->rchild=C->lchild;
						C->lchild=A;
						C->rchild=B;
						if (S->key <C->key) 
						{ 
							A->bf=0;
							B->bf=-1;
							C->bf=0;
						}
						else 
							if (S->key >C->key)
							{
								A->bf=1;
								B->bf=0;
								C->bf=0;
							}
							else 
							{ 
								A->bf=0;
								B->bf=0;
							}
							if (FA==NULL)  
								*avlt=C;
							else
								if (A==FA->lchild) 
									FA->lchild=C;
								else  
									FA->rchild=C;
					}
					else 
						if (A->bf==-2 && B->bf==-1)       /* RR型 */
						{
							B=A->rchild;
							A->rchild=B->lchild;
							B->lchild=A;
							A->bf=0;
							B->bf=0;
							if (FA==NULL) 
								*avlt=B;
							else
								if (A==FA->lchild)
									FA->lchild=B;
								else 
									FA->rchild=B;
						}
				}
		}
}

void  CreateAVLT(AVLTree  *bst)
/*从键盘输入元素的值,创建相应的二叉排序树*/
{ 
	KeyType key;
	*bst=NULL;
	scanf("%d", &key);
	while (key!=100)   
	{
		ins_AVLtree(bst, key);
		scanf("%d", &key);
	}
}

void  PreOrder(AVLTree root) 
/*先序遍历二叉树, root为指向二叉树根结点的指针*/
{
	if (root!=NULL)
	{
	
		PreOrder(root->lchild);  /*先序遍历左子树*/
		printf("%d  ",root->key);  /*输出结点*/
		PreOrder(root->rchild);  /*先序遍历右子树*/
	}
}

void main()
{
	AVLTree T;
	
	printf("建立二叉排序树,请输入序列:\n");
    CreateAVLT(&T);
	printf("先序遍历输出序列为:");
	PreOrder(T);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值