边插入边平衡。首先写好L,R,LR,RL的函数,并在每一步插入时更新balance的情况,按balance的情况,调用函数即可平衡。
// Problem#: 19624
// Submission#: 4906418
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
// Problem#: 19624
// Submission#: 4906311
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include<iostream>
using namespace std;
struct tree {
int data;
int balance;
tree* left;
tree* right;
tree(int e) {
data=e;
balance=0;
left=right=NULL;
}
};
void preorder(tree*& t) {
if(t==NULL) return;
else {
cout<<t->data<<" ";
preorder(t->left);
preorder(t->right);
}
}
void L(tree* &p) {
tree* re;
re=p->right;
p->right=re->left ;
re->left=p;
p=re;
}
void R(tree* &p) {
tree* re;
re=p->left;
p->left=re->right ;
re->right=p;
p=re;
}
void LR(tree* &p) {
tree*& lt=p->left;
switch(lt->balance) {
case -1:
p->balance=0;
lt->balance=0;
R(p);
break;
case 1: {
tree* rd=lt->right;
switch(rd->balance) {
case -1:
p->balance=1;
lt->balance=0;
break;
case 0:
p->balance=0;
lt->balance=0;
break;
case 1:
p->balance=0;
lt->balance=-1;
break;
}
rd->balance=0;
L(lt);
R(p);
break;
}
}
}
void RL(tree* &p) {
tree*& rt=p->right;
switch(rt->balance) {
case 1:
p->balance=0;
rt->balance=0;
L(p);
break;
case -1: {
tree* rd=rt->left;
switch(rd->balance) {
case -1:
p->balance=0;
rt->balance=1;
break;
case 0:
p->balance=0;
rt->balance=0;
break;
case 1:
p->balance=-1;
rt->balance=0;
break;
}
rd->balance=0;
R(rt);
L(p);
break;
}
}
}
void insert(tree* &p,int& n,bool& m) {//m¡À¨º?????¨¨¨º?¡¤?¡À??¡¥
if(p==NULL) {
p=new tree(n);
m=1;
} else if(n<=p->data) {
insert(p->left,n,m);
if(m==1) {
switch(p->balance) {
case -1:
LR(p);
m=false;
break;
case 0:
p->balance=-1;
break;
case 1:
p->balance=0;
m=false;
break;
}
}
} else {
insert(p->right,n,m);
if(m==1) {
switch(p->balance) {
case 1:
RL(p);
m=false;
break;
case 0:
p->balance=1;
break;
case -1:
p->balance=0;
m=false;
break;
}
}
}
}
void deletetree(tree* &p) {
if(p==NULL) return;
else {
deletetree(p->left);
deletetree(p->right);
delete p;
}
}
int main() {
int t;
cin>>t;
while(t--) {
int n,e;
cin>>n;
tree* p=NULL;
bool m=true;
for(int i=0 ; i<n ; i++) {
cin>>e;
insert(p,e,m);
}
preorder(p);
cout<<endl;
deletetree(p);
}
return 0;
}
本文介绍了一种在AVL树中进行节点插入并保持树平衡的方法。通过定义L、R、LR、RL四种旋转操作,确保每次插入新节点后都能通过相应的旋转使树重新达到平衡状态。该实现包括了节点的创建、前序遍历等功能。
2327

被折叠的 条评论
为什么被折叠?



