您的位置:首页 > 其它

pta---搜索树判断

2016-07-11 20:28 288 查看
某颗搜索二叉树或者某颗搜索二叉树的镜像树的前序遍历,,输出的后序遍历应该是前面两颗二叉树中的一颗的后续遍历,

/*5-6 搜索树判断   (25分)

对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包

含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。

现在我们给出一个整数键值序列,请编写程序判断该序列是否为

某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。

输入格式:

输入的第一行包含一个正整数N(≤\le≤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*/

#include <iostream>

using namespace std;
int tree1[1002],n,m=1,j=0,t=0;

struct treenode{
treenode* left;
treenode* right;
int a;

};
//treenode* node=new treenode;
treenode* T=new treenode;

void newtree(treenode *tree1,int l){
treenode* node=new treenode;
treenode* k=new treenode;
node->a=l;

if(l<tree1->a){
if(tree1->left==NULL){
tree1->left=node;
node->left=NULL;
node->right=NULL;
}else{
k=tree1->left;
newtree(k,l);
}
}
else{
if(tree1->right==NULL){
tree1->right=node;
node->left=NULL;
node->right=NULL;
}else{
k=tree1->right;
newtree(k,l);
}
}

}

void pre(treenode *node){
if(node==NULL){
return ;
}
if(node!=NULL){
// cout<<node->a<<" ";
// m+=1;

if(node->a!=tree1[j]){
m=0;
return ;
}
j+=1;
}
pre(node->left);
pre(node->right);

}

void later(treenode *node){
if(node==NULL){
return ;
}
if(node!=NULL){
// cout<<node->a<<" ";
if(node->a!=tree1[j]){
m=0;
return ;
}
j+=1;
}
later(node->right);
later(node->left);

}

void la(treenode *node){
if(node==NULL) return;
la(node->left);
la(node->right);
if(t==n-1){
cout<<node->a<<endl;
}
else
cout<<node->a<<" ";
t=t+1;

}

void la2(treenode *node){
if(node==NULL) return;
la2(node->right);
la2(node->left);
if(t==n-1){
cout<<node->a<<endl;
}
else
cout<<node->a<<" ";
t=t+1;

}

int main(){
int i;
while(cin>>n){
t=0;
m=1;
j=0;
for(i=0;i<n;i++){
cin>>tree1[i];
}
//if(n==0){

//cout<<"YES"<<endl;

// return 0;}
for(i=0;i<n;i++){
if(i==0){
//T=newtree(node,tree1[i]);
T->a=tree1[i];
T->left=NULL;
T->right=NULL;
}
else{
newtree(T,tree1[i]);
}
}
pre(T);
if(m==1){
cout<<"YES"<<endl;
la(T);
}
if(m==0){
j=0;
m=1;

later(T);
if(m==1){
cout<<"YES"<<endl;
la2(T);
}
else{
cout<<"NO"<<endl;
}}}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: