4-06. 搜索树判断(25)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式说明:
输入的第一行包含一个正整数N(<=1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式说明:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出“YES”,否侧输出“NO”。如果判断结果是“YES”,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
样例输入与输出:
序号 | 输入 | 输出 |
1 | 7 8 6 5 7 10 8 11 | YES 5 7 6 8 11 10 8 |
2 | 7 8 10 11 8 6 7 5 | YES 11 8 10 7 5 6 8 |
3 | 7 8 6 8 5 10 9 11 | NO |
4 | 16 100 70 60 62 68 65 69 200 150 140 160 155 300 400 500 450 | YES 65 69 68 62 60 70 140 155 160 150 450 500 400 300 200 100 |
5 | 17 85 92 100 120 110 105 88 90 50 20 30 40 35 36 32 28 15 | YES 105 110 120 100 90 88 92 36 32 35 40 28 30 15 20 50 85 |
6 | 7 8 6 7 5 10 11 9 | NO |
7 | 1 -1 | YES -1 |
正确代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstdlib>
using namespace std;
#define LEN (struct node*)malloc(sizeof(struct node))
struct node
{
int num;
struct node* l;
struct node* r;
};
vector<int> v;
int nu[1005];
node* Insert(int num,node *t)
{
if(!t)
{
t=LEN;
t->num=num;
t->l=t->r=NULL;
}
else
{
if(num<t->num)
t->l=Insert(num,t->l);
else
t->r=Insert(num,t->r);
}
return t;
}
void qian(node *t)
{
if(!t)
return ;
v.push_back(t->num);
qian(t->l);
qian(t->r);
}
void hou(node *t)
{
if(!t)
return ;
hou(t->l);
hou(t->r);
v.push_back(t->num);
}
void jingxiang(node* t)
{
node *p;
if(!t)
return ;
p=t->l;
t->l=t->r;
t->r=p;
jingxiang(t->l);
jingxiang(t->r);
}
int main()
{
int n,i,flag=0,flag1=0;
node *t;
t=NULL;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&nu[i]);
t=Insert(nu[i],t);
}
qian(t);
for(i=0;i<n;i++)
{
if(v[i]!=nu[i])
{
flag=1;
break;
}
}
if(flag)
{
jingxiang(t);
v.clear();
qian(t);
for(i=0;i<n;i++)
{
if(v[i]!=nu[i])
{
flag1=1;
break;
}
}
}
if(flag&&flag1)
printf("NO\n");
else
{
printf("YES\n");
v.clear();
hou(t);
for(i=0;i<n;i++)
{
if(i)
printf(" ");
printf("%d",v[i]);
}
printf("\n");
}
return 0;
}