AVL树插入算法

该博客详细探讨了AVL树的插入算法,重点在于如何保持树的平衡,确保其始终保持平衡因子为-1、0或1。尽管在内容中提及没有使用平衡因子,但插入过程中通常会涉及这一概念,以维护树的高度平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

没有用到平衡因子。。。

数据结构如下:

struct avl{
	int data;//节点数字
	int frequency;//插入的次数
	int hight;//节点高度
	avl *left;//左子树
	avl* right;//右子树
};
code:

#include<stdio.h>
#include<malloc.h>

struct avl{
	int data;//节点数字
	int frequency;//插入的次数
	int hight;//节点高度
	avl *left;//左子树
	avl* right;//右子树
};
int max(int a,int b){
	return a>b?a:b;}
avl* init(int root_data){

	avl* p=(avl*)malloc(sizeof(avl));
	p->data=root_data;
	p->frequency=1;
	p->left=NULL;
	p->right=NULL;
	p->hight=0;
	return p;
}
int hgt(avl *x)
{
	if(!x)
		return -1;
	return x->hight;
}
void leftrotate(avl * &root){
	avl *tmp=root->right;
	root->right=tmp->left;
	tmp->left=root;
	root->hight=max(hgt(root->left),hgt(root->right))+1;
	tmp->hight=max(hgt(tmp->left),hgt(tmp->right))+1;
	root=tmp;

}
void rightrotate(avl * &root){
	avl *tmp=root->left;
	root->left=tmp->right;
	tmp->right=root;
	root->hight=max(hgt(root->left),hgt(root->right))+1;
	tmp->hight=max(hgt(tmp->left),hgt(tmp->right))+1;
	root=tmp;

}
void LRrotate(avl * &root){
	leftrotate(root->left);
	rightrotate(root);
}
void RLrotate(avl * &root){
	rightrotate(root->right);
	leftrotate(root);
}
void  insert(avl * &root,int x){
	avl *p=init(x);
	if(!root)
		root=p;
	else if(root->data==x)
		root->frequency++;
	else if(root->data>x){
		insert(root->left,x);
		if(hgt(root->left)-hgt(root->right)==2){
			if(x<root->left->data)
				rightrotate(root);	
			else if(x>root->left->data)
				LRrotate(root);	
		}
	}
	else if(root->data<x){
		insert(root->right,x);
		if(hgt(root->right)-hgt(root->left)==2){
			if(x>root->right->data)
				leftrotate(root);	
			else if(x<root->right->data)
				RLrotate(root);	
		}
	}
	root->hight=max(hgt(root->left),hgt(root->right))+1;
}
int main(){

	avl* root=NULL;
	insert(root,3);
	insert(root,7);
	insert(root,8);
	insert(root,2);
	insert(root,1);
	insert(root,9);
	insert(root,5);
	insert(root,10);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值