利用二叉树中序及先序遍历确定该二叉树的后序序列问题

本文详细介绍了如何使用二叉树的中序和前序遍历来确定其后序遍历序列,通过具体实例和两种代码实现方式,帮助读者深入理解二叉树遍历的原理。

利用二叉树中序及先序遍历确定该二叉树的后序序列

中序遍历:BFDAEGC
前序遍历:ABDFCEG
根据中序遍历和前序遍历的性质:
1.前序遍历,从左到右依次为根节点
2.中序遍历,若我们找到一个根节点,那么在一个范围内,根节点的左边为左子树的节点,右边为右子树的节点。

大体过程:根据前序遍历的节点确定根节点,再通过根节点在中序遍历中确定该节点的左右子树的节点。

步骤:1.前序遍历ABDFCEG加粗的A即为根节点,在中序遍历中BFDAEGC,这样即可确认节点A的左子树的节点有BFD,右子树的节点有EGC,根据前序遍历的性质左子树的根节点为B,右子树的根节点为C(代码中有注解)
2.重复上述过程,直到确定了每个节点在后序遍历中的位置。
这里还有:利用二叉树中序及后序遍历确定该二叉树的先序序列问题


代码1(通过数组):

#include"bits/stdc++.h"
using namespace std;

#define MAX 24

void postorder(char in[],char pre[],int root,int start,int end){	
	if(start>end){
		return;
	}
	char rot=pre[root];	//根节点 
	int index;
	for(int i=0;i<strlen(in);i++){	//找到根节点在中序遍历中的位置 
		if(rot==in[i]){
			index=i;
			break;
		}
	}
	postorder(in,pre,root+1,start,index-1);	//左子树 
	postorder(in,pre,root+index-start+1,index+1,end);	//右子树,index-start为左子树有多少个节点,从而通过root+index-start+1即可在前序遍历中得到右子树的根节点位置 
	cout<<rot;
	
}

int main(){
	char inorder[MAX],preorder[MAX];
	cin>>inorder>>preorder;
	postorder(inorder,preorder,0,0,strlen(inorder)-1);
	
	return 0;
}
/*
in:
BFDAEGC
ABDFCEG

out:
FDBGECA

*/

代码2(通过string类):

#include"bits/stdc++.h"
using namespace std;

void postorder(string preorder,string inorder){
	if(!preorder.size()){
		return;
	}
	char root;
	int k;
	root=preorder[0];
	k=inorder.find(root);	//找到root的索引
	postorder(preorder.substr(1,k),inorder.substr(0,k));	//左子树 
	postorder(preorder.substr(k+1),inorder.substr(k+1));	//右子树 
	cout<<root;
	
}
int main(){
	string inorder,preorder;
	cin>>inorder>>preorder;
	postorder(preorder,inorder);
	
	return 0;
}
/*
这里对string.substr()说明一下:
若括号中为(0,5)则从索引为0的元素开始截取5位即(0,1,2,3,4),
若括号中为(5)则从索引为5的元素开始截取到末尾。

in:
BFDAEGC
ABDFCEG

out:
FDBGECA

*/

欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值