04-树5 Root of AVL Tree

题目

在这里插入图片描述
在这里插入图片描述

思路

AVL树的动态调整操作:二叉搜索树的Insert操作+AVL调整操作

核心代码
typedef struct TreeNode* BT; 
struct TreeNode{    
   int data;    
   BT left;    
   BT right;    
   int BF;
};
int height(BT Tree)
{    
   int hl,hr,max;    
   if(Tree==NULL) return 0;    
   else{        
      hl=height(Tree->left);        
      hr=height(Tree->right);       
      max=(hl>hr)?hl:hr;        
      return(max+1); } 
} 
int BF(BT Tree) 
{    
    if(Tree==NULL)   return 0;    
    else    return (height(Tree->left)-height(Tree->right)); 
}
BT singleLeft(BT A)
{    
   BT B=A->left;    
   A->left=B->right;    
   B->right=A;    
   A->BF=BF(A);    
   B->BF=BF(B);    
   return B;
}
BT singleRight(BT A)
{    
    BT B;    
    B=A->right;    
    A->right=B->left;    
    B->left=A;    
    A->BF=BF(A);    
    B->BF=BF(B);    
    return B; 
}
BT LR_rotation(BT A)
{   
     A->left=singleRight(A->left);    
     return singleLeft(A);
}
BT RL_rotation(BT A)
{    
     A->right=singleLeft(A->right);    
     return singleRight(A);
}
BT insert(BT Tree,int data) 
{    
     if(Tree==NULL){        
        Tree=(BT)malloc(sizeof(struct TreeNode));//attention        
        Tree->data=data;        
        Tree->left=Tree->right=NULL;
        Tree->BF=BF(Tree);
     }     
     else{        
        if(Tree->data<data){            
           Tree->right=insert(Tree->right,data);            
           if(BF(Tree)==-2){                
              if(data>Tree->right->data) Tree=singleRight(Tree);                
              else Tree=RL_rotation(Tree);
            }         
         }                   
        else if(Tree->data>data){            
             Tree->left=insert(Tree->left,data);            
             if(BF(Tree)==2){                
                if(data<Tree->left->data) Tree=singleLeft(Tree);                
                else Tree=LR_rotation(Tree);            
              }          
         }        
      }     
      Tree->BF=BF(Tree);     
      return Tree;//有时候插入元素即便 不需要调整结构,也可能需要重新计算一些平衡因子。  
} 
BT PlantTree(int N) 
{    
   int data;    
   int _BF;    
   scanf("%d",&data);    
   BT Tree,position,new_position;    
   Tree=(BT)malloc(sizeof(struct TreeNode)); 
   Tree=NULL;   
    for(int i=0;i<N;i++){        
      scanf("%d",&data);        
      Tree=insert(Tree,data);}    
   return Tree;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值