二叉搜索树前序序列转后序序列(或相反)

二叉搜索树前序序列转后序序列(或相反)

这篇文章转自柳婼大神的博客。

普通的二叉树知道前序遍历序列或后序遍历序列和中序遍历序列后可以转换为另一种遍历序列,根据前序或后序遍历序列找根,再根据中序遍历序列划分左右子树,再获取左子树和右子树的根。

但二叉排序树比较特殊,因为二叉排序树的特性(左子树的所有结点的值小于根结点的值,右子树的所有结点的值大于等于根结点的值),所有可以直接根据前序序列转换为后序序列,反之亦然。

前序转后序序列代码:

#include<iostream>
#include<vector>
using namespace std;
vector<int> pre,post;
void getPost(int root,int tail){ //root->根,tail->最后一个结点索引 
	if(root > tail) return ;
	int i=root+1; //获取根结点下一个结点 
	int j = tail; //j从最后一个结点起
	//极限情况没有右子树,最后i==tail+1 
	while(i <= tail && pre[i] < pre[root]){
		i++;//用i指示右子树根结点 
	} 
	//极限情况没有左子树,最后j==root 
	while(j > root && pre[j] >= pre[root]){
		j--;//用于标识右子树根结点的前一个结点
	}
	//最终j和i必然相差1,因为i指示右子树根结点
	if(j != root) getPost(root+1,j); //将左子树的后序遍历序列获取到并加入到post序列中 
	if(i != tail+1) getPost(i,tail); // 将右子树的后序遍历序列获取到并加入到post序列中 
	post.push_back(pre[root]); 
}
int main(){
    int n; 
    cin>>n;
    pre.resize(n);
    for(int i=0;i<n;i++){
    	cin>>pre[i];
	}
	getPost(0,n-1);
	for(int i=0;i<post.size();i++){
		printf("%d ",post[i]);
	} 
    return 0;
}

Sample input:

7
8 6 5 7 10 8 11

Sample output:

5 7 6 8 11 10 8
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值