题目描述
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数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。相同输出YES,则进行后序遍历,输出遍历的数组。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int n,num[N],temp[N],idx;
struct node{
int val;
node* left;
node* right;
node(int x): val(x),left(NULL),right(NULL){}
};
node* root;
node* insert(node* root,int u) //插入节点建立搜索树
{
if(!root) root=new node(u);
else if(root->val > u) root->left=insert(root->left,u); //当前节点值小于根节点,为左子树
else root->right=insert(root->right,u);
return root;
}
bool f1;
void pre(node *root) //树的前序遍历
{
if(!root) return ;
temp[++idx]=root->val;
pre(root->left);
pre(root->right);
}
void post(node *root) //树的后序遍历
{
if(!root) return ;
post(root->left);
post(root->right);
temp[++idx]=root->val;
}
node* mirror(node *root) //对树进行镜像操作
{
if(!root) return NULL;
root->left=mirror(root->left); //优先对子树进行翻转
root->right=mirror(root->right);
auto t=root->left;
root->left=root->right;
root->right=t;
return root;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
root=insert(root,num[i]); //每输入一个节点值就插到搜索树当中
}
pre(root); //通过前序遍历建立temp[]
for(int i=1;i<=n;i++)
{
if(num[i]!=temp[i]) f1=1; //如果前序遍历和输入的数组不同,则要对镜像进行判断
}
if(!f1){
puts("YES");
idx=0;
post(root); //后序遍历生成序列
for(int i=1;i<=n;i++)
{
if(i>1) cout<<" ";
cout<<temp[i]; //输出答案
}
}
else{
idx=0;
mirror(root); //对二叉树进行镜像处理
pre(root); //镜像后进行前序遍历,生成temp[]
for(int i=1;i<=n;i++)
{
if(num[i]!=temp[i]) //和输入的数组不同,说明失败
{
puts("NO");
return 0;
}
}
puts("YES");
idx=0;
post(root); //后序遍历生成temp[]
for(int i=1;i<=n;i++) //输出后序序列
{
if(i>1) cout<<" ";
cout<<temp[i];
}
}
return 0;
}