AVL树是一种自平衡二叉排序树,它的特点是任何一个节点的左子树高度和右子树的高度差在-1,0,1三者之间。AVL树的任何一个子树都是AVL树。
旋转
插入操作:
template<typename T>
struct BiTNode{
T val;
int h;
BiTNode *left,*right;
BiTNode(){}
BiTNode(T val):val(val){
left=NULL;right=NULL;
}
};
template<typename T,typename node=BiTNode<T>>
class AVL
{
public:
AVL():n(0),root(NULL){}
AVL(T *bg,T *ed):n(0),root(NULL){while(bg!=ed)insert(*bg++);}
~AVL(){clear(root);}
void insert(const T& key){insert(root,key);}
void clear(){clear(root);}
int size()const{return n;}
bool empty()const{return n==0;}
int leaf()const{return leaf(root);}
vector<T> DLR(){vector<T>v;DLR(root,v);return v;}
vector<T> LDR(){vector<T>v;LDR(root,v);return v;}
vector<T> LRD(){vector<T>v;LRD(root,v);return v;}
vector<T> _DLR(){vector<T>v;_DLR(root,v);return v;}
vector<T> _LDR(){vector<T>v;_LDR(root,v);return v;}
vector<T> _LRD(){vector<T>v;_LRD(root,v);return v;}
vector<T> bfs(){vector<T>v;bfs(root,v);return v;}
int max_height()const{return height(root);}
void erase(const T& key){erase(root,key);}
bool find(const T& key)const{return search(key)!=NULL;}
private:
void bfs(node *Tree,vector<T>&v)
{
if(Tree==NULL)return;
queue<node*>q;
q.push(Tree);
while(!q.empty())
{
node *p=q.front();
v.push_back(p->val);
q.pop();
if(p->left)q.push(p->left);
if(p->right)q.push(p->right);
}
}
void DLR(node *Tree,vector<T>&v)
{
if(Tree==NULL){return ;}
v.push_back(Tree->val);
DLR(Tree->left,v);
DLR(Tree->right,v);
}
void LDR(node *Tree,vector<T>&v)
{
if(Tree==NULL){return ;}
LDR(Tree->left,v);
v.push_back(Tree->val);
LDR(Tree->right,v);
}
void LRD(node *Tree,vector<T>&v)
{
if(Tree==NULL){return ;}
LRD(Tree->left,v);
LRD(Tree->right,v);
v.push_back(Tree->val);
}
void _DLR(node *Tree,vector<T>&v)
{
stack<node*>Stack;
node *p=Tree;
while(p!=NULL||!Stack.empty())
{
if(p)
{
v.push_back(p->val);
Stack.push(p);
p=p->left;
}
else
{
p=Stack.top();
Stack.pop();
p=p->right;
}
}
}
void _LDR(node *Tree,vector<T>&v)
{
stack<node*>Stack;
node *p=Tree;
while(p!=NULL||!Stack.empty())
{
if(p)
{
Stack.push(p);
p=p->left;
}
else
{
p=Stack.top();
Stack.pop();
v.push_back(p->val);
p=p->right;
}
}
}
void _LRD(node *Tree,vector<T>&v)
{
stack<node*>Stack;
Stack.push(Tree);
node *pre,*cur;
cur=pre=NULL;
while(!Stack.empty())
{
cur=Stack.top();
if((cur->left == NULL && cur->right == NULL) \
|| (pre != NULL && (pre == cur->left || pre == cur->right)))
{
v.push_back(cur->val);
cur=Stack.top();
Stack.pop();
pre=cur;
}
else
{
if(cur->right!=NULL)Stack.push(cur->right);
if(cur->left!=NULL)Stack.push(cur->left);
}
}
}
int leaf(node *Tree)
{
if(Tree==NULL)return 0;
if(Tree->left==NULL && Tree->right==NULL)return 1;
return leaf(Tree->left)+leaf(Tree->right);
}
void insert(node* &rt,const T& key)
{
if(rt==NULL)
{
rt=new node(key);
++n;
}
else if(key<rt->val)
{
insert(rt->left,key);
int H=height(rt->left)-height(rt->right);
if(H==2)
{
if(key<rt->left->val)LL(rt);
else LR(rt);
}
}
else if(key>rt->val)
{
insert(rt->right,key);
int H=height(rt->left)-height(rt->right);
if(H==-2){
if(key>rt->right->val)RR(rt);
else RL(rt);
}
}
uph(rt);
}
void uph(node* &p){p->h=max(height(p->left),height(p->right))+1;}
int height(node* p){return p==NULL?-1:p->h;}
void LL(node* &rt)
{
node* p=rt->left;
rt->left=p->right;
p->right=rt;
uph(p);uph(rt);rt=p;
}
void RR(node* &rt)
{
node* p=rt->right;
rt->right=p->left;
p->left=rt;
uph(p);uph(rt);rt=p;
}
void LR(node* &rt){RR(rt->left);LL(rt);}
void RL(node* &rt){LL(rt->right);RR(rt);}
node* &search(const T& key)
{
node* p=root;
while(p)
{
if(p->val==key)return p;
if(key<p->val)p=p->left;
else p=p->right;
}
return NULL;
}
void clear(node* &rt)
{
if(rt==NULL)return;
clear(rt->left);clear(rt->right);
delete rt;--n;rt=NULL;
}
void erase(node* &rt,const T& key)
{
if(rt==NULL)return;
if(key<rt->val)
{
erase(rt->left,key);
int H=height(rt->left)-height(rt->right);
if(H==-2)
{
int x=height(rt->right->right);
int y=height(rt->right->left);
if(x>y)RR(rt);else RL(rt);
}
}
else if(key>rt->val)
{
erase(rt->right,key);
int H=height(rt->left)-height(rt->right);
if(H==2)
{
int x=height(rt->left->left);
int y=height(rt->left->right);
if(x>y)LL(rt);else LR(rt);
}
}
else if(key==rt->val&&rt->left&&rt->right)
{
node* q=rt->left;
while(q->right)q=q->right;
rt->val=q->val;
erase(rt->left,rt->val);
}else
{
node* q=rt->left==NULL?rt->right:rt->left;
delete rt;rt=q;--n;
}
if(rt)uph(rt);
}
private:
node *root;
int n;
}; 
京公网安备 11010502036488号