一个性质:
二叉搜索树的 前序序列 通过 排序 就是 中序序列了
/*
之前知道,构造二叉搜索树需要:前序+中序 / 后序+中序
观察本题是一棵二叉搜索树,
把二叉搜索树的先序序列经过从小到大排序就是中序变遍历了
*/
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int n;
int preorder[N],inorder[N];
struct Node
{
int key;
Node *l,*r;
Node(){}
Node(int key):key(key),l(NULL),r(NULL){}
};
Node *build(int pl,int pr,int il,int ir)
{
if(pl>pr) return NULL;
Node *root=new Node(preorder[pl]);
int k=il;
while(inorder[k]!=root->key)
{
k++;
}
root->l=build(pl+1,pr-ir+k,il,k-1);
root->r=build(pr-ir+k+1,pr,k+1,ir);
return root;
}
void post_order_traverse(Node *root)
{
if(root==NULL)
{
return;
}
if(root->l) post_order_traverse(root->l);
if(root->r) post_order_traverse(root->r);
cout<<root->key<<" ";
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>preorder[i];
inorder[i]=preorder[i];
}
sort(inorder,inorder+n);
Node *root=build(0,n-1,0,n-1);
post_order_traverse(root);
return 0;
}