1043 Is It a Binary Search Tree (25 分)
题意
给定一个整数序列,判断它是否可能是某个二叉搜索树或其镜像进行前序遍历的结果。对镜像树的先序遍历只需要在原树的先序遍历时交换左右子树的访问顺序即可。
注意点
- 结点中存放的是下标。
- 使用vector来存放初始序列、先序序列、镜像树先序序列,可以方便相互之间的比较。
- 由于结点的值会有重复,不能采用map存值的写法。
const int N=1010;
PII tree[N];
vector<int> a;
vector<int> pre,pre_mirror,post,post_mirror;
int n;
void insert(int &root,int idx)
{
if(root == -1)
{
root=idx;
tree[root]={-1,-1};
return;
}
if(a[idx] < a[root])
insert(tree[root].fi,idx);
else
insert(tree[root].se,idx);
}
void preorder(int root)
{
if(root == -1) return;
pre.pb(a[root]);
preorder(tree[root].fi);
preorder(tree[root].se);
}
void preorder_mirror(int root)
{
if(root == -1) return;
pre_mirror.pb(a[root]);
preorder_mirror(tree[root].se);
preorder_mirror(tree[root].fi);
}
void postorder(int root)
{
if(root == -1) return;
postorder(tree[root].fi);
postorder(tree[root].se);
post.pb(a[root]);
}
void postorder_mirror(int root)
{
if(root == -1) return;
postorder_mirror(tree[root].se);
postorder_mirror(tree[root].fi);
post_mirror.pb(a[root]);
}
int main()
{
cin>>n;
a.resize(n);
for(int i=0;i<n;i++) cin>>a[i];
int root=-1;
for(int i=0;i<n;i++)
insert(root,i);
preorder(0);
preorder_mirror(0);
if(a == pre)
{
puts("YES");
postorder(0);
for(int i=0;i<post.size();i++)
if(i) cout<<' '<<post[i];
else cout<<post[i];
cout<<endl;
}
else if(a == pre_mirror)
{
puts("YES");
postorder_mirror(0);
for(int i=0;i<post_mirror.size();i++)
if(i) cout<<' '<<post_mirror[i];
else cout<<post_mirror[i];
cout<<endl;
}
else puts("NO");
//system("pause");
return 0;
}