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;
}
/*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;
}
相关文章推荐
- android developer tiny share-20160711
- android developer tiny share-20160711
- 输出二叉树中路径上结点值之和为给定值的所有路径
- codeforces 361 B - Mike and Shortcuts
- 基于busybox文件系统挂载nfs卡死现象解决办法
- QtQuick 上拉加载的实现
- 谈谈RGB、YUY2、YUYV、YVYU、UYVY、AYUV
- hdu2031 进制转换
- bzoj 4415: [Shoi2013]发牌
- 默认复制构造函数 bitwise 语义 delete 多次----腾讯2016研发工程师笔试题(一)
- 命令行安装IIS方法之一
- volley的使用(二)
- FastDFS install
- [leetcode-372]Super Pow(java)
- 自定义控件_day02
- 建kafka gradle工程解决证书认证问题
- babystep.....脑残的baby(QAQ)提高训练
- $().each和$.each()的区别
- Android重打包
- AssetBundle系列——资源的加载、简易的资源管理器