7-25 搜索树判断 (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
思路:
根据题给的先序遍历建立二叉搜索树,对二叉搜索树进行先序遍历和镜面先序遍历,然后与所给的先序序列进行比对,如果两种遍历中有一个和所给序列一样,那么输出yes,并且输出后序遍历,否则输出no
注意:如果相等,分后序遍历和镜面后序遍历
代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int maxn=1005;
typedef struct node* BinTree;
int n,s=0,t=0,k=0;
int a[maxn],b[maxn],c[maxn],d[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)
{
b[s++]=BST->data;
PreorderTraversal(BST->left);
PreorderTraversal(BST->right);
}
}
//镜面先序输出
void MirrorPreorderTraversal(BinTree BST)
{
if(BST)
{
c[t++]=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=1;
}
}
//镜面后序遍历
int k2=0;
void MirrorPostorderTraversal(BinTree BST)
{
if(BST)
{
MirrorPostorderTraversal(BST->right);
MirrorPostorderTraversal(BST->left);
if(k2) cout<<" ";
cout<<BST->data;
k2=1;
}
}
int main()
{
BinTree BST;
BST=NULL;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
BST=CreatTree(BST,a[i]);
}
PreorderTraversal(BST);
MirrorPreorderTraversal(BST);
int flag1=1,flag2=1;
for(int i=0;i<n;i++)
{
if(a[i]!=b[i])
{
flag1=0;
break;
}
}
for(int i=0;i<n;i++)
{
if(a[i]!=c[i])
{
flag2=0;
break;
}
}
if(flag1==0&&flag2==0)
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
if(flag1)
PostorderTraversal(BST);
if(flag1==0&&flag2)
MirrorPostorderTraversal(BST);
}
return 0;
}