理论模板
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define INF 3f3f3f3f
using namespace std;
typedef long long ll;
template <typename T>
struct AvlNode
{
T data;
int height;
AvlNode<T> *left;
AvlNode<T> *right;
AvlNode<T>(const T theData):data(theData),left(NULL),right(NULL),height(0){}
};
template <typename T>
class AvlTree
{
public:
AvlNode<T> *root;
AvlTree<T>():root(NULL){}
~AvlTree<T>(){}
void Insert(AvlNode<T> *&t,T x);
bool Delete(AvlNode<T> *&t,T x);
bool Contains(AvlNode<T> *t,const T x) const;
void InorderTraversal(AvlNode<T> *t);
void PreorderTraversal(AvlNode<T> *t);
AvlNode<T> *FindMin(AvlNode<T> *t) const;
AvlNode<T> *FindMax(AvlNode<T> *t) const;
private:
int GetHeight(AvlNode<T> *t);
AvlNode<T> *LL(AvlNode<T> *t);
AvlNode<T> *RR(AvlNode<T> *t);
AvlNode<T> *LR(AvlNode<T> *t);
AvlNode<T> *RL(AvlNode<T> *t);
};
template <typename T>
AvlNode<T> *AvlTree<T>::FindMax(AvlNode<T> *t) const
{
if(t==NULL)
return NULL;
if(t->right==NULL)
return t;
return FindMax(t->right);
}
template <typename T>
AvlNode<T> *AvlTree<T>::FindMin(AvlNode<T> *t) const
{
if(t==NULL)
return NULL;
if(t->left==NULL)
return t;
return FindMin(t->left);
}
template <typename T>
int AvlTree<T>::GetHeight(AvlNode<T> *t)
{
if(t==NULL)
return -1;
return t->height;
}
template <typename T>
AvlNode<T> *AvlTree<T>::LL(AvlNode<T> *t)
{
AvlNode<T> *q=t->left;
t->left=q->right;
q->right=t;
t->height=max(GetHeight(t->left),GetHeight(t->right))+1;
q->height=max(GetHeight(q->left),GetHeight(q->right))+1;
return q;
}
template <typename T>
AvlNode<T> *AvlTree<T>::RR(AvlNode<T> *t)
{
AvlNode<T> *q=t->right;
t->right=q->left;
q->left=t;
t->height=max(GetHeight(t->left),GetHeight(t->right))+1;
q->height=max(GetHeight(q->left),GetHeight(q->right))+1;
return q;
}
template <typename T>
AvlNode<T> *AvlTree<T>::LR(AvlNode<T> *t)
{
RR(t->left);
return LL(t);
}
template <typename T>
AvlNode<T> *AvlTree<T>::RL(AvlNode<T> *t)
{
LL(t->right);
return RR(t);
}
template <typename T>
void AvlTree<T>::Insert(AvlNode<T> *&t,T x)
{
if(t==NULL)
{
t=new AvlNode<T>(x);
}
else if(x<t->data)
{
Insert(t->left,x);
if(GetHeight(t->left)-GetHeight(t->right)>1)
{
if(x<t->left->data)
t=LL(t);
else
t=LR(t);
}
}
else if(x>t->data)
{
Insert(t->right,x);
if(GetHeight(t->right)-GetHeight(t->left)>1)
{
if(x>t->right->data)
t=RR(t);
else
t=RL(t);
}
}
else
;
t->height=max(GetHeight(t->left),GetHeight(t->right))+1;
}
template <typename T>
bool AvlTree<T>::Delete(AvlNode<T> *&t,T x)
{
if(t==NULL)
return false;
else if(t->data==x)
{
if(t->left!=NULL && t->right!=NULL)
{
if(GetHeight(t->left)>GetHeight(t->right))
{
t->data=FindMax(t->left)->data;
Delete(t->left,t->data);
}
else
{
t->data=FindMin(t->right)->data;
Delete(t->right,t->data);
}
}
else
{
AvlNode<T> *old=t;
t=t->left?t->left:t->right;
delete old;
}
}
else if(x<t->data)
{
Delete(t->left,x);
if(GetHeight(t->right)-GetHeight(t->left)>1)
{
if(GetHeight(t->right->left)>GetHeight(t->right->right))
{
t=RL(t);
}
else
{
t=RR(t);
}
}
else
{
t->height=max(GetHeight(t->left),GetHeight(t->right))+1;
}
}
else
{
Delete(t->right,x);
if(GetHeight(t->left)-GetHeight(t->right)>1)
{
if(GetHeight(t->left->right)>GetHeight(t->left->left))
{
t=LR(t);
}
else
{
t=LL(t);
}
}
else
{
t->height=max(GetHeight(t->left),GetHeight(t->right))+1;
}
}
return true;
}
template <typename T>
bool AvlTree<T>::Contains(AvlNode<T> *t,const T x) const
{
if(t==NULL)
return false;
if(x<t->data)
return Contains(t->left,x);
else if(x>t->data)
return Contains(t->right,x);
else
return true;
}
template <typename T>
void AvlTree<T>::InorderTraversal(AvlNode<T> *t)
{
if(t)
{
InorderTraversal(t->left);
printf("%d ",t->data);
InorderTraversal(t->right);
}
}
template <typename T>
void AvlTree<T>::PreorderTraversal(AvlNode<T> *t)
{
if(t)
{
printf("%d ",t->data);
PreorderTraversal(t->left);
PreorderTraversal(t->right);
}
}
template <typename T>
void showTraversal(AvlTree<T> &tree)
{
printf("中序遍历:");
tree.InorderTraversal(tree.root);
printf("\n前序遍历:");
tree.PreorderTraversal(tree.root);
}
int main()
{
AvlTree<int> tree;
int val,tmp;
printf("请输入整数建立二叉树(-1 end):\n");
while(~scanf("%d",&val))
{
if(val==-1)
break;
tree.Insert(tree.root,val);
}
showTraversal(tree);
printf("\n请输入要查找的结点: ");
scanf("%d",&tmp);
if(tree.Contains(tree.root,tmp))
printf("已找到\n");
else
printf("不存在\n");
printf("请输入要删除的结点: ");
scanf("%d",&tmp);
tree.Delete(tree.root,tmp);
showTraversal(tree);
return 0;
}

ACM 模板
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
struct node
{
int val;
node *left,*right;
};
vector<int> v;
int after, isComp;
node *LL(node *tree)
{
node *tmp=tree->right;
tree->right=tmp->left;
tmp->left=tree;
return tmp;
}
node *RR(node *tree)
{
node *tmp=tree->left;
tree->left=tmp->right;
tmp->right=tree;
return tmp;
}
node *LR(node *tree)
{
tree->left=LL(tree->left);
tree=RR(tree);
return tree;
}
node *RL(node *tree)
{
tree->right=RR(tree->right);
tree=LL(tree);
return tree;
}
int getHeight(node *tree)
{
if(tree==NULL) return 0;
int l=getHeight(tree->left), r=getHeight(tree->right);
return l>r ? l+1 : r+1;
}
node *insert(node *tree, int val)
{
if(tree==NULL)
{
tree=new node();
tree->val=val;
return tree;
}
if(tree->val>val)
{
tree->left=insert(tree->left,val);
int l=getHeight(tree->left), r=getHeight(tree->right);
if(l-r>=2)
if(tree->left->val > val) tree=RR(tree);
else tree=LR(tree);
}
else
{
tree->right=insert(tree->right,val);
int l=getHeight(tree->left), r=getHeight(tree->right);
if(r-l>=2)
if(tree->right->val < val) tree=LL(tree);
else tree=RL(tree);
}
return tree;
}
void bfs(node *tree)
{
v.clear();
queue<node*> q;
q.push(tree);
after=0, isComp=1;
while(!q.empty())
{
tree=q.front(); q.pop();
v.push_back(tree->val);
if(tree->left!=NULL)
{
if(after) isComp=0;
q.push(tree->left);
}
else after=1;
if(tree->right!=NULL)
{
if(after) isComp=0;
q.push(tree->right);
}
else after=1;
}
}
int main()
{
int n,val;
while(~scanf("%d",&n))
{
node *tree=NULL;
for(int i=0;i<n;i++)
{
scanf("%d",&val);
tree=insert(tree,val);
}
bfs(tree);
for(int i=0;i<v.size()-1;i++) printf("%d ",v[i]);
printf("%d\n",v[v.size()-1]);
puts(isComp?"YES":"NO");
}
return 0;
}