题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=202
一定要仔细的读题!!! 题目要求旋转完了再输出中序序列,而不是旋转一次输出一次,坑!!!!
性质:红黑树旋转几次之后中序序列都一样!!!!
第一次写旋转的代码:
#include <cstdio>
#include <cstring>
struct node
{
int parent,leftchild,rightchild;
} tree[20];
int n;
int a[20];
int m;
void init()
{
memset(tree,0,sizeof(tree));
tree[0].parent = -1;
}
void print(int node)
{
if(node != -1)
{
print(tree[node].leftchild);
printf("%d\n",node);
print(tree[node].rightchild);
}
}
int search_root()
{
for(int i = 0;i < n;++i)
{
if(tree[a[i]].parent == -1)
return a[i];
}
}
void modify(int node,int key)
{
for(int i = 0;i < n;++i)
{
if(tree[a[i]].leftchild == node)
{
tree[a[i]].leftchild = key;
return ;
}
else if(tree[a[i]].rightchild == node)
{
tree[a[i]].rightchild = key;
return ;
}
}
}
void op(int node,int flag)
{
if(flag)
{
if(tree[node].leftchild != -1)
{
int t = tree[node].parent;
int left = tree[node].leftchild;
int left_right = tree[left].rightchild;
modify(node,left);
tree[left].parent = t;
tree[left].rightchild = node;
tree[node].leftchild = left_right;
tree[node].parent = left;
if(left_right != -1)
tree[left_right].parent = node;
}
}
else
{
if(tree[node].rightchild != -1)
{
int t = tree[node].parent;
int right = tree[node].rightchild;
int right_left = tree[right].leftchild;
modify(node,right);
tree[right].parent = t;
tree[node].rightchild = right_left;
tree[node].parent = right;
tree[right].leftchild = node;
if(right_left != -1)
tree[right_left].parent = node;
}
}
int root = search_root();
print(root);
printf("\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
for(int i = 0; i < n; ++i)
{
int b,c;
scanf("%d%d%d",&a[i],&b,&c);
tree[a[i]].leftchild = b;
tree[a[i]].rightchild = c;
}
for(int i = 0; i < n; ++i)
{
if(tree[a[i]].leftchild != -1)
{
tree[tree[a[i]].leftchild].parent = a[i];
}
if(tree[a[i]].rightchild != -1)
tree[tree[a[i]].rightchild].parent = a[i];
}
scanf("%d",&m);
int node,flag;
while(m--)
{
scanf("%d%d",&node,&flag);
//for(int i = 0;i < n;++i)
// printf("%d %d %d %d\n",a[i],tree[a[i]].leftchild,tree[a[i]].rightchild,tree[a[i]].parent);
}
op(node,flag);
}
}
第二次直接输出中序序列就好了:
#include <cstdio>
#include <cstring>
struct node
{
int parent,leftchild,rightchild;
} tree[20];
int n;
int a[20];
int m;
void init()
{
memset(tree,0,sizeof(tree));
tree[0].parent = -1;
}
void print(int node)
{
if(node != -1)
{
print(tree[node].leftchild);
printf("%d\n",node);
print(tree[node].rightchild);
}
}
int search_root()
{
for(int i = 0;i < n;++i)
{
if(tree[a[i]].parent == -1)
return a[i];
}
}
void modify(int node,int key)
{
for(int i = 0;i < n;++i)
{
if(tree[a[i]].leftchild == node)
{
tree[a[i]].leftchild = key;
return ;
}
else if(tree[a[i]].rightchild == node)
{
tree[a[i]].rightchild = key;
return ;
}
}
}
void op(int node,int flag)
{
if(flag)
{
if(tree[node].leftchild != -1)
{
int t = tree[node].parent;
int left = tree[node].leftchild;
int left_right = tree[left].rightchild;
modify(node,left);
tree[left].parent = t;
tree[left].rightchild = node;
tree[node].leftchild = left_right;
tree[node].parent = left;
if(left_right != -1)
tree[left_right].parent = node;
}
}
else
{
if(tree[node].rightchild != -1)
{
int t = tree[node].parent;
int right = tree[node].rightchild;
int right_left = tree[right].leftchild;
modify(node,right);
tree[right].parent = t;
tree[node].rightchild = right_left;
tree[node].parent = right;
tree[right].leftchild = node;
if(right_left != -1)
tree[right_left].parent = node;
}
}
int root = search_root();
print(root);
printf("\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
for(int i = 0; i < n; ++i)
{
int b,c;
scanf("%d%d%d",&a[i],&b,&c);
tree[a[i]].leftchild = b;
tree[a[i]].rightchild = c;
}
for(int i = 0; i < n; ++i)
{
if(tree[a[i]].leftchild != -1)
{
tree[tree[a[i]].leftchild].parent = a[i];
}
if(tree[a[i]].rightchild != -1)
tree[tree[a[i]].rightchild].parent = a[i];
}
scanf("%d",&m);
while(m--)
{
int node,flag;
scanf("%d%d",&node,&flag);
//op(node,flag);
//for(int i = 0;i < n;++i)
// printf("%d %d %d %d\n",a[i],tree[a[i]].leftchild,tree[a[i]].rightchild,tree[a[i]].parent);
}
int root = search_root();
print(root);
printf("\n");
}
}