一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
- 其左子树中所有结点的键值小于该结点的键值;
- 其右子树中所有结点的键值大于等于该结点的键值;
- 其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。
输出格式:
如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出 YES
,然后在下一行输出该树后序遍历的结果。数字间有 1 个空格,一行的首尾不得有多余空格。若答案是否,则输出 NO
。
输入样例 1:
7
8 6 5 7 10 8 11
输出样例 1:
YES
5 7 6 8 11 10 8
输入样例 2:
7
8 10 11 8 6 7 5
输出样例 2:
YES
11 8 10 7 5 6 8
输入样例 3:
NO
先构建二叉排序树,再对比前序遍历是否一致;
node* inster(node *bt ,int k){
if(bt == nullptr){
bt=new node;
bt->date=k;
bt->l=nullptr;
bt->r=nullptr;
}
else if(k<bt->date){ //其左子树中所有结点的键值小于该结点的键值;
bt->l=inster(bt->l,k);
}
else if(k>=bt->date){//其右子树中所有结点的键值大于等于该结点的键值;
bt->r=inster(bt->r,k);
}
return bt;
}
#include<bits/stdc++.h>
using namespace std;
vector<int> v1,v2,v3,v4;
struct node{
int date;
node *l,*r;
};
void qian(node *bt){//前序遍历
if(bt==nullptr)
return ;
v1.push_back(bt->date);
qian(bt->l);
qian(bt->r);
}
void qian1(node *r){//镜像前序遍历
if(r!=nullptr){
v2.push_back(r->date);
qian1(r->r);
qian1(r->l);
}
}
void hou(node *r){//后序遍历
if(r!=nullptr){
hou(r->l);
hou(r->r);
v3.push_back(r->date);
//cout<<r->date<<endl;
}
}
void hou1(node *r){//镜像后续遍历
if(r!=nullptr){
hou1(r->r);
hou1(r->l);
v4.push_back(r->date);
//cout<<r->date<<endl;
}
}
int n,a[1001];
node* inster(node *bt ,int k){//构建二叉排序树
if(bt == nullptr){
bt=new node;
bt->date=k;
bt->l=nullptr;
bt->r=nullptr;
}
else if(k<bt->date){
bt->l=inster(bt->l,k);
}
else if(k>=bt->date){
bt->r=inster(bt->r,k);
}
return bt;
}
int main(){
cin>>n;
node *t=nullptr;
for(int i=0;i<n;i++){
cin>>a[i];
t=inster(t,a[i]);
}
qian(t);
qian1(t);
hou(t);
hou1(t);
bool t2=true;
for(int i=0;i<n;i++){
if(a[i]!=v1[i]){
t2=false;
break;
}
}
if(t2){
cout<<"YES"<<endl;
for(int i=0;i<n-1;i++) cout<<v3[i]<<" ";
cout<<v3[n-1];
}
else{
bool t1=true;
for(int i=0;i<n;i++){
if(a[i]!=v2[i]){
t1=false;
break;
}
}
if(t1){
cout<<"YES"<<endl;
for(int i=0;i<n-1;i++) cout<<v4[i]<<" ";
cout<<v4[n-1];
}
else{
cout<<"NO"<<endl;
}
}
return 0;
}
也可以用数组模拟骗23分
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int a[N]={0};
int b[N];
int q[N];
int q1[N];
int n,j;
int h[N];
int h1[N];
void inster(int k){
if(a[1]==0){
a[1]=k;
return ;
}
else{
int i=1;
while(1){
if(a[i]==0)break;
if(k<a[i]){
i=i*2;
}
else{
i=i*2+1;
}
}
a[i]=k;
//cout<<i<<endl;
}
return ;
}
void dfs(int i){
if(a[i]!=0){
q[j++]=a[i];
dfs(i*2);
dfs(i*2+1);
}
return ;
}
void dfs1(int i){
if(a[i]!=0){
q1[j++]=a[i];
dfs1(i*2+1);
dfs1(i*2);
}
return ;
}
void dfsh(int i){
if(a[i]!=0){
dfsh(i*2);
dfsh(i*2+1);
h[j++]=a[i];
}
return ;
}
void dfsh1(int i){
if(a[i]!=0){
dfsh1(i*2+1);
dfsh1(i*2);
h1[j++]=a[i];
}
return ;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
inster(b[i]);
}
j=1;
dfs(1);
j=1;
dfs1(1);
int f1=0,f2=0;
for(int i=1;i<=n;i++){
//cout<<q[i]<<endl;
if(b[i]!=q[i]){
f1=1;
break;
}
}
for(int i=1;i<=n;i++){
//cout<<q1[i]<<endl;
if(b[i]!=q1[i]){
f2=1;
break;
}
}
if(f1==0){
cout<<"YES"<<endl;
j=1;
dfsh(1);
for(int i=1;i<=n;i++){
if(i==1){
cout<<h[i];
}
else{
cout<<" "<<h[i];
}
}
}
else if(f2==0){
cout<<"YES"<<endl;
j=1;
dfsh1(1);
for(int i=1;i<=n;i++){
if(i==1){
cout<<h1[i];
}
else{
cout<<" "<<h1[i];
}
}
}
else{
cout<<"NO"<<endl;
}
return 0;
}