7-28 搜索树判断 (25分)
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
思路:建立起二叉搜索树,分别写出先序遍历,后序遍历以及相应镜像的相关操作,再一一比较
#include<iostream>
#define maxn 1005
using namespace std;
typedef struct node* BinTree;
int n,index_p=0,index_m=0,k=0;
int input[maxn],pre[maxn],mirror[maxn];
struct node{
int data;
BinTree left,right;
};
//建立二叉搜索树
BinTree CreatTree(BinTree BST,int x)
{
if(!BST)
{
BST=(BinTree)malloc(sizeof(struct node));
BST->data=x;
BST->left=BST->right=NULL;
}
else
{
if(x<BST->data)
BST->left=CreatTree(BST->left,x);
else if(x>=BST->data)
BST->right=CreatTree(BST->right,x);
}
return BST;
}
//先序遍历
void PreorderTraversal(BinTree BST)
{
if(BST)
{
pre[index_p++]=BST->data;
PreorderTraversal(BST->left);
PreorderTraversal(BST->right);
}
}
//镜面先序输出
void MirrorPreorderTraversal(BinTree BST)
{
if(BST)
{
mirror[index_m++]=BST->data;
MirrorPreorderTraversal(BST->right);
MirrorPreorderTraversal(BST->left);
}
}
//后序遍历
int k1=0;
void PostorderTraversal(BinTree BST)
{
if(BST)
{
PostorderTraversal(BST->left);
PostorderTraversal(BST->right);
if(k1) cout<<" ";
cout<<BST->data;
k1++;
}
}
//镜面后序遍历
int k2=0;
void MirrorPostorderTraversal(BinTree BST)
{
if(BST)
{
MirrorPostorderTraversal(BST->right);
MirrorPostorderTraversal(BST->left);
if(k2) cout<<" ";
cout<<BST->data;
k2++;
}
}
int main()
{
BinTree BST;
BST=NULL;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>input[i];
BST=CreatTree(BST,input[i]);
}
PreorderTraversal(BST);
MirrorPreorderTraversal(BST);
int flag1=1,flag2=1;
for(int i=0;i<n;i++)
{
if(input[i]!=pre[i])
{
flag1=0;
break;
}
}
for(int i=0;i<n;i++)
{
if(input[i]!=mirror[i])
{
flag2=0;
break;
}
}
if(!flag1&&!flag2)
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
if(flag1)
PostorderTraversal(BST);
if(flag1==0&&flag2)
MirrorPostorderTraversal(BST);
}
return 0;
}