您的位置:首页 > 其它

NYOJ202红黑树

2016-08-31 20:32 176 查看
题目链接: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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  红黑树 搜索