#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Treenode{
int data;
int height;
struct Treenode*lchild;
struct Treenode*rchild;
}treenode;
int getheight(treenode*node){
return node?node->height:0;//节点存在则返回其高度,不存在则返回0
}
int max(int a,int b){
return a>b?a:b;
}
void llrotation(treenode*node,treenode**root){
treenode*temp=node->lchild;
node->lchild=temp->rchild;
temp->rchild=node;
node->height=max(getheight(node->lchild),getheight(node->rchild))+1;
temp->height=max(getheight(temp->lchild),getheight(temp->rchild))+1;
*root=temp;
}
void rrrotation(treenode*node,treenode**root){
//*node为子树的根,**root是整个二叉树的根
treenode*temp=node->rchild;
node->rchild=temp->lchild;
temp->lchild=node;
node->height=max(getheight(node->lchild),getheight(node->rchild))+1;
temp->height=max(getheight(temp->lchild),getheight(temp->rchild))+1;
*root=temp;
}
void avlinsert(treenode**T,int data){
if(*T==NULL){
//插入操作
*T=(treenode*)malloc(sizeof(treenode));
(*T)->data=data;
(*T)->height=0;
(*T)->lchild=NULL;
(*T)->rchild=NULL;
}else if(data < (*T)->data){
avlinsert(&(*T)->lchild,data);//寻找的到位置进行插入
//插入成功后看左右子树高度差
int lheight=getheight((*T)->lchild);
int rheight=getheight((*T)->rchild);
if(lheight-rheight==2){
if(data < (*T)->lchild->data){
//LL调整
llrotation(*T,T);
}else{
//LR调整
//先把后面的子树从RR调整变成LL结构
//再用LL调整平衡二叉树
rrrotation((*T)->lchild,&(*T)->lchild);
llrotation(*T,T);
}
}
}else{
avlinsert(&(*T)->rchild,data);//寻找的到位置进行插入
//插入成功后看左右子树高度差
int lheight=getheight((*T)->lchild);
int rheight=getheight((*T)->rchild);
if(rheight-lheight==2){
if(data > (*T)->rchild->data){
//RR调整
rrrotation(*T,T);
}else{
//Rl调整
//先把后面的子树从LL调整变成RR结构
//再用RR调整平衡二叉树
llrotation((*T)->rchild,&(*T)->rchild);
rrrotation(*T,T);
}
}
}
//插入之后对节点求高度
(*T)->height=max(getheight((*T)->lchild),getheight((*T)->rchild))+1;
}
void preorder(treenode*T){
if(T){
printf("%d ",T->data);
preorder(T->lchild);
preorder(T->rchild);
}
}
int main(){
treenode*T=NULL;
int nums[5]={1,8,6,7,10};
for(int i=0;i<5;i++){
avlinsert(&T,nums[i]);
}
preorder(T);
return 0;
}
二叉平衡树(AVL)
最新推荐文章于 2024-08-30 21:09:25 发布