#include<iostream>
#include<queue>
using namespace std;
typedef class poinner* on;
class poinner{//AVL树定义
public:
int val;
on left,right;
poinner():val(0),left(nullptr),right(nullptr){}
poinner(int val):val(val),left(nullptr),right(nullptr){}
on create(int val);
void insert(on &head,int val);
on deletepoin(on head,int val);
void b_prin(on head);
void d_prin1(on head);
void d_prin2(on head);
void d_prin3(on head);
int count(on head);
int get(on head);
on balance(on head);
on LL(on head);
on RR(on head);
on RL(on head);
on LR(on head);
};
on poinner::create(int val){//创建
poinner*head=new poinner(val);
return head;
}
void poinner::insert(on &head,int val){//插入
if(!head){
head=create(val);
}else if(val<head->val){
insert(head->left,val);
head=balance(head);
}else if(val>head->val){
insert(head->right,val);
head=balance(head);
}else{
}
}
on poinner::balance(on head){//通过这个方法使树自平衡
int ans=count(head);
if(ans>1){
if(count(head->left)>0){
return LL(head);
}else{
return LR(head);
}
}
else if(ans<-1){
if(count(head->left)<0){
return RL(head);
}else{
return RR(head);
}
}
return head;
}
on poinner::LL(on head){//下面是四种旋转
on tem=head->left;
head->left=tem->right;
tem->right=head;
return tem;
}
on poinner::RR(on head){
on tem=head->right;
head->right=tem->left;
tem->left=head;
return tem;
}
on poinner::RL(on head){
head->left=LL(head->left);
return RR(head);
}
on poinner::LR(on head){
head->right=RR(head->right);
return LL(head);
}
int poinner::get(on head){//计算树高
if(!head)return 0;
return max(get(head->left),get(head->right))+1;
}
int poinner::count(on head){//计算平衡因子
if(!head)return 0;
return get(head->left)-get(head->right);
}
void poinner::b_prin(on head){//层次
queue<on>q;
if(!head)return ;
q.push(head);
while(!q.empty()){
on tem=q.front();
if(tem){
cout<<tem->val<<" ";
q.push(tem->right);
q.push(tem->left);
}
q.pop();
}
}
void poinner::d_prin1(on head){//先序
if(!head)return ;
cout<<head->val<<" ";
poinner::d_prin1(head->left);
poinner::d_prin1(head->right);
}
void poinner::d_prin2(on head){//中序
if(!head)return ;
poinner::d_prin1(head->left);
cout<<head->val<<" ";
poinner::d_prin1(head->right);
}
void poinner::d_prin3(on head){//后序
if(!head)return ;
poinner::d_prin1(head->left);
poinner::d_prin1(head->right);
cout<<head->val<<" ";
}
on min(on head){
while(head->left){
head=head->left;
}
return head;
}
on poinner::deletepoin(on head,int val){//删除,与二叉搜索树相同
if(!head)return head;
if(val<head->val){
head->left=deletepoin(head->left,val);
}else if(val>head->val){
head->right=deletepoin(head->right,val);
}else{
on tem=head;
if(head->left&&head->right){
tem=min(head->right);
head->val=tem->val;
head->right=deletepoin(head->right,head->val);
}else{
tem=head;
if(!head->left){
head=head->right;
}else if(!head->right){
head=head->left;
}
delete(tem);
balance(head);
}
}
return head;
}
int main(){//测试
on head=head->create(5);
head->insert(head,4);
head->insert(head,3);
head->insert(head,2);
head->insert(head,1);
head->b_prin(head);
cout<<endl;
head->deletepoin(head,4);
head->b_prin(head);
return 0;
}
c++对AVL树的简单实现
最新推荐文章于 2024-01-15 23:00:27 发布