Description
给定一个1到n的排列(无重复元素),按顺序依次插入到一棵二叉排序树中,请你将这棵二叉树前序遍历和后序遍历输出。
保证树高不超过50 。
Input
第一行一个整数n。(1 ≤ n ≤ 100000)
接下来一行表示为n个整数,代表1到n的一个排列。
Output
输出所建成的二叉树的前序遍历和后序遍历。
Sample Input
10
2 6 9 3 5 7 10 8 4 1
Sample Output
2 1 6 3 5 4 9 7 8 10
1 4 5 3 8 7 10 9 6 2
#include<iostream>
#include<vector>
using namespace std;
const int N =100005; //记录最大元素个数
struct node{
int val,l,r; //t数组中每一个结构体存储一个元素的信心
//包括该结点关键字(即该结点本身)指向左子树的位置指向右子树的位置
}t[N];
int root,cnt; //root记录根结点cnt记录当前元素的个数
int insert(int v,int x){//在x位置即在结构体数组中所占的位置插入v
if(x==0){ //如果该位置为0即表示该位置没有放入元素
x=++cnt; //在该位置建立一个新的以v为根结点的树
t[x].val=v; //左右子树为0
t[x].l=0;
t[x].r=0;
return x;
}
if(t[x].val<v)
t[x].r=insert(v,t[x].r);//当该元素比当前树的根结点大时进行递归的右子树插入
else t[x].l=insert(v,t[x].l);//否则向左插入
return x;//返回当前位置
}
void dlr(int x,vector<int > &ans) //进行前序遍历并将结果存放到数组中
{ if(x){ //防止输出根结点的下一结点
ans.push_back(t[x].val);
dlr(t[x].l,ans);
dlr(t[x].r,ans);
}
}
void lrd(int x,vector<int > &ans){//进行后序遍历并将结果存放到数组中
if(x){ //防止输出根结点的下一结点
lrd(t[x].l,ans) ;
lrd(t[x].r,ans);
ans.push_back(t[x].val);
}}
vector<int> getAnswer(int n, vector<int> sequence){ //建立二叉排序树并进行遍历
root=cnt=0;
for(int i=0;i<int(sequence.size());i++){
root =insert(sequence[i],root);
}
vector<int>ans;
dlr(root,ans);
lrd(root,ans);
return ans;
}
int main(){
int n;
cin>>n;
vector<int>quecence;
for(int i=0;i<n;i++){
int k;
cin>>k;
quecence.push_back(k);
}
vector<int > ans=getAnswer(n,quecence);
for(int i=0;i<n;i++)
printf("%d%c",ans[i]," \n"[i==n-1]);
for(int i=0;i<n;i++)
printf("%d%c",ans[n+i]," \n"[i==n-1]);
return 0;
}