7-7 搜索树判断 (25分)
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES
,否侧输出NO
。如果判断结果是YES
,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
输入样例1:
7
8 6 5 7 10 8 11
输出样例1:
YES
5 7 6 8 11 10 8
输入样例2:
7
8 6 8 5 10 9 11
输出样例2:
NO
DS课程组
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<bits/stdc++.h>
using namespace std;
typedef struct treenode
{
int data;
struct treenode*left;
struct treenode *right;
}Tnode,*BiTree;
BiTree Build_Tree(BiTree T,int x);
void pre_list(BiTree T);
void pre_list2(BiTree T);
int pre1[1010];
int pre2[1010];
int num=0;
int post[1010];
int post2[1010];
void post_order1(BiTree T);
void post_order2(BiTree T);
int main()
{
int n;
cin>>n;
int list[n];
int i;
for(i=0;i<n;i++){
cin>>list[i];
}
BiTree T=NULL;
//T=(BiTree)malloc(sizeof(Tnode));
for(i=0;i<n;i++){
T=Build_Tree(T,list[i]);
}
pre_list(T);
num=0;
pre_list2(T);
// for(i=0;i<n;i++){
// cout<<pre1[i]<<" ";
// }
int flag1=1;
int flag2=1;
for(i=0;i<n;i++){
if(pre1[i]!=list[i]){
flag1=0;
break;
}
}
for(i=0;i<n;i++){
if(pre2[i]!=list[i]){
flag2=0;
break;
}
}
if(flag1==1){
cout<<"YES"<<endl;
num=0;
post_order1(T);
for(i=0;i<n;i++){
if(i==0){
cout<<post[i];
}else{
cout<<" "<<post[i];
}
}
}else if(flag2==1){
cout<<"YES"<<endl;
num=0;
post_order2(T);
for(i=0;i<n;i++){
if(i==0){
cout<<post2[i];
}else{
cout<<" "<<post2[i];
}
}
}
else{
cout<<"NO"<<endl;
}
return 0;
}
BiTree Build_Tree(BiTree T,int x)
{
if(T==NULL){
T=(BiTree)malloc(sizeof(Tnode));
T->data=x;
T->left=NULL;
T->right=NULL;
}else{
if(x>=T->data){
T->right=Build_Tree(T->right,x);
}else{
T->left=Build_Tree(T->left,x);
}
}
return T;
}
void pre_list(BiTree T)
{
if(T==NULL){
return ;
}
pre1[num++]=T->data;
pre_list(T->left);
pre_list(T->right);
}
void pre_list2(BiTree T)
{
if(T==NULL){
return ;
}
pre2[num++]=T->data;
pre_list2(T->right);
pre_list2(T->left);
}
void post_order1(BiTree T)
{
if(T==NULL){
return;
}
post_order1(T->left);
post_order1(T->right);
post[num++]=T->data;
}
void post_order2(BiTree T)
{
if(T==NULL) return ;
post_order2(T->right);
post_order2(T->left);
post2[num++]=T->data;
}