二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
它的左、右子树也分别为二叉搜索树
我们将二叉搜索树镜面翻转得到的树称为二叉搜索树的镜像。
现在,给定一个整数序列,请你判断它是否可能是某个二叉搜索树或其镜像进行前序遍历的结果。
输入格式
第一行包含整数 N,表示节点数量。
第二行包含 N 个整数。
输出格式
如果给定整数序列是某个二叉搜索树或其镜像的前序遍历序列,则在第一行输出 YES,否则输出 NO。
如果你的答案是 YES,则还需要在第二行输出这棵树的后序遍历序列。
数据范围
1≤N≤1000
输入样例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:
7
8 6 8 5 10 9 11
输出样例3:
NO
模拟,建立两颗二叉搜索树,存好前序序列(二叉搜索树就是根据前序序列建的),比较,输出相应那一颗的后序遍历。
#include <bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node*l,*r;
};int num=0;
int n;
const int N = 1010;
int a[N];
vector<int> v[4];
struct node*create(int shu,struct node*tree)
{
if(tree==NULL)
{
tree = new node;
tree->data = shu;
tree->l=NULL;
tree->r=NULL;
return tree;
}
else if(shu<tree->data)
{
tree->l=create(shu,tree->l);
}
else
tree->r= create(shu,tree->r);
return tree;
}
struct node*create1(int shu,struct node*tree)
{
if(tree==NULL)
{
tree = new node;
tree->data = shu;
tree->l=NULL;
tree->r=NULL;
return tree;
}
else if(shu>=tree->data)
{
tree->l=create1(shu,tree->l);
}
else
tree->r= create1(shu,tree->r);
return tree;
}
void qianxv(struct node*root)
{
if(root)
{
v[num].push_back(root->data);
qianxv(root->l);
qianxv(root->r);
}
}
void houxv(struct node*root)
{
if(root)
{
houxv(root->l);
houxv(root->r);
v[3].push_back(root->data);
}
}
int main()
{
cin >>n;
struct node*p=NULL;
struct node*q=NULL;
for(int i=1;i<=n;i++)
{
int shu;
cin >> shu;
v[2].push_back(shu);
p=create(shu,p);
q=create1(shu,q);
}
qianxv(p);
num++;
qianxv(q);
for(int i=0;i<2;i++)
{
if(v[i]==v[2])
{
cout <<"YES"<<endl;
if(i==0)
houxv(p);
else
houxv(q);
for(int i=0;i<v[3].size();i++)
{
cout <<v[3][i];
if(i!=v[3].size()-1)
cout <<" ";
}
return 0;
}
}
cout <<"NO";
return 0;
}