两种写法解决利用二叉树中序及后序遍历确定该二叉树的先序序列问题

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

中序遍历:DCBFEGAH
后序遍历:DCFGEBHA
根据中序遍历和后续遍历的性质:
1.它们都是先遍历左子树。
2.后序遍历中从右到左依次为对应子树的根结点。
3.中序遍历中若我们找到一个根节点,那么在一个范围内,根节点的左边为左子树,右边为右子树。

过程如下:
1.DCBFEG AH
DCFGEB HA, A为根节点,在中序遍历中它的左边即为左子树(6个节点),右边为右子树(1个节点);在后序遍历中我们即可根据左右子树的节点个数确定后序遍历中的左右子树,根据后序遍历的性质,我们即可确定左右子树的根节点分别为:B,H。
接下来就是根据左右子树的根节点再进行如上的过程
2.
DC BFEG
DC FGEB
3.

重要的就是 选取好分段点
这里还有:利用二叉树中序及先序遍历确定该二叉树的后序序列问题


代码1如下(通过数组):

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

#define MAX 24

void preorder(char in[],char post[],int root,int start,int end){//root为根节点
	if(start>end){
		return;
	}
	char rot=post[root];
	int index;
	for(int i=0;i<strlen(in);i++){	//找到中序遍历中根节点所在位置
		if(rot==in[i]){
			index=i;	//记录位置
			break;
		}
	}
	cout<<rot;
//	getchar();
	preorder(in,post,root-end+index-1,start,index-1);	//左子树 
	preorder(in,post,root-1,index+1,end);	//右子树 
	
}
int main(){
	char inorder[MAX],postorder[MAX];
	cin>>inorder>>postorder;
	preorder(inorder,postorder,strlen(inorder)-1,0,strlen(inorder)-1);
	
	return 0;
}
/*
in:
DCBFEGAH
DCFGEBHA

out:
ABDFCEG
	
*/

代码2如下(通过string类):代码2参考于此

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

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

out:
ABDFCEG

*/

若有错误,请指正

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 利用二叉树中序遍历和后序遍历可以确定二叉树先序序列。具体方法如下: 1. 后序遍历的最后一个节点一定是根节点,将其记录下来。 2. 在中序遍历中找到根节点的位置,将中序遍历分成左子树和右子树两部分。 3. 根据左子树和右子树的节点数量,将后序遍历分成左子树和右子树两部分。 4. 递归处理左子树和右子树,得到左子树和右子树的先序序列。 5. 将根节点和左子树的先序序列、右子树的先序序列拼接起来,得到整个二叉树先序序列。 需要注意的是,在递归处理左子树和右子树时,需要根据左子树和右子树的节点数量来确定后序遍历的左子树和右子树的范围。如果左子树或右子树为空,那么相应的先序序列也为空。 ### 回答2: 首先,我们需要了解二叉树的遍历方式。二叉树的遍历方式有三种:先序遍历中序遍历和后序遍历先序遍历是从根节点开始,先遍历左子树,再遍历右子树。中序遍历是先遍历左子树,再遍历根节点,最后遍历右子树。后序遍历是先遍历左子树,再遍历右子树,最后遍历根节点。 假设现在我们有一个二叉树,该二叉树中序遍历为:DBEAFC,后序遍历为:DEBFCA。现在我们需要确定二叉树先序序列。我们可以利用以下方法确定: 1.找出后序遍历序列的最后一个节点,即根节点,该节点是先序遍历序列的第一个节点。 2.在中序遍历序列中找出根节点的位置,将中序遍历序列分为左子树和右子树两个部分。 3.分别对左子树和右子树进行遍历,得到左子树的先序序列和右子树的先序序列。 4.将左子树的先序序列和右子树的先序序列依次拼接在根节点之后,即得到该二叉树先序序列。 按照上述方法,我们可以得到该二叉树先序序列为:ABDECF。具体步骤如下: 1.后序遍历序列为DEBFCA,最后一个节点为A,因此A是先序遍历序列的第一个节点。 2.在中序遍历序列中找到A的位置,将中序遍历序列分为左子树DBE和右子树FC两个部分。 3.左子树中的节点顺序为DBE,其先序遍历序列为:D、B、E;右子树中的节点顺序为FC,其先序遍历序列为:F、C。 4.将上述两个先序序列依次拼接在A之后,即可得到该二叉树先序序列为:ABDECF。 ### 回答3: 二叉树前序、中序后序遍历二叉树中最基本也是最常见的三种遍历方式,它们分别表示对树中所有节点的遍历方式,它们的命名方式取决于遍历根节点的顺序。如果我们只知道一颗二叉树中序后序遍历,但不知道其前序遍历,可以通过一定的方法推导出其前序遍历。 我们通过画图来模拟一下怎样根据中序遍历和后序遍历确定二叉树的前序遍历。举个例子,我们假设现在已知二叉树中序遍历序列为:F H J K T X U N L O G A M P S Q,后序遍历序列为:F J K H X N O L U G M Q S P A T。首先我们需要定位中序遍历序列中根节点的位置,这里根节点是T。然后我们根据后序遍历序列,将其最后一个节点T定位为根节点,随后按照根节点分割左右子树的方法,将后序遍历序列分为两部分:F H J K X U N L O G A M P S Q | T,其中 | 表示根节点。接下来我们用同样的方法来处理中序遍历序列,将其按照根节点T的位置分为两部分:F H J K | T | X U N L O G A M P S Q。根据中序遍历我们可以推得左子树的节点序列为F H J K,右子树的节点序列为X U N L O G A M P S Q。接下来我们可以继续重复上述过程去构造左右子树的前序遍历序列,得到左子树的前序遍历序列为:T H F J K X N O L U G M Q S P A,右子树的前序遍历序列为:T X U N L O G A M P S Q。最后,我们可以将左右子树的前序遍历序列合并在一起,再加上根节点T,即可得到二叉树的前序遍历序列:T H F J K X N O L U G M Q S P A T。 总的来说,通过二叉树中序遍历和后序遍历,我们可以确定二叉树的一些信息,例如二叉树的叶子节点、节点数、深度,以及可以通过这个方式推导出二叉树的前序遍历序列。当然,如果我们已知二叉树的前序遍历序列中序遍历序列,我们同样可以通过类似的方式推导出其后序遍历序列

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值