NCSTOJ 1358 : 二叉排序树

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;
	
	
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值