平衡二叉树:平衡二叉树的插入操作实现(C语言)

平衡二叉树:

为了避免二叉排序树高度增长过快,降低二叉排序树的性能,所以有了平衡二叉树。规定任意结点的左右子树高度差绝对值不超过1,这样的二叉树称为平衡二叉树

实现代码:

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


//平衡二叉树的结构体
typedef struct BBTree{
	int data;
	int advance;//平衡因子 
	BBTree *lchild;
	BBTree *rchild;
}BBTree; 

//左旋
void L(BBTree *&root){
	BBTree *temp=root->rchild;//root指向结点A,temp指向结点
	root->rchild=temp->lchild;//步骤1
	temp->lchild=root;//步骤2
	root->advance--;//更新结点A 的平衡因子 
	temp->advance--;//更新结点B 的平衡因子 
	root=temp;//步骤3 
}
//右旋
void R(BBTree *&root){
	BBTree *temp=root->lchild;//root指向结点A,temp指向结点B
	root->lchild=temp->rchild;//步骤1
	temp->rchild=root;//步骤2
	root->advance--;
	temp->advance--;
	root=temp;//步骤3 
}

//插入权值为v的结点

int  insert(BBTree *&p,int key){
	if(p==NULL){//到达空结点
		p =(BBTree*)malloc(sizeof(BBTree));
		p->data=key;
		p->advance=0; 
		p->lchild=NULL;
		p->rchild=NULL; 
		return 1; 
	}else{
		if(key==p->data) {
			printf("该数据已经存在");
			return 0;
		}else if(key <p->data){
			insert(p->lchild,key);
			p->advance++;//更新平衡因子 
			if(p->advance==2){
				if(p->lchild->advance==1){
				//LL型
				    printf("右单旋转\n");
					R(p); 
				}else if(p->lchild->advance==-1){
				//LR型
				    printf("先左后右双旋转\n");
					L(p->lchild);
					R(p); 
				}
		 	} 
		 	return 1;
	   }else if(key>p->data){
		//v比根结点的权值大
		insert(p->rchild,key);//往右子树中插入
		p->advance--;//更新平衡因子 
		if(p->advance==-2){
			if(p->rchild->advance==-1){
			//RR型
			printf("左单旋转\n"); 
			L(p); 
			}else if(p->rchild->advance==1){
				//RL型
				printf("先右后左双旋转\n"); 
				R(p->lchild);
				L(p); 
			}
		} 
		return 1;
	    }
	}

} 
//建树 
void createBBTree(BBTree *&p,int array[],int length){
	for(int i=0;i<length;i++){
		int a=insert(p,array[i]);
	}
}
int main(){
	int array[]={27,16,75,38,51};
	BBTree *p=NULL;
	createBBTree(p,array,5);
	printf("%d  ",p->rchild->data);
}

代码运行截图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值