二叉树的遍历(先序、中序、后序的转化)

二叉树的遍历

性质:

已知先序序列和中序序列可确定一棵唯一的二叉树;

已知后序序列和中序序列可确定一棵唯一的二叉树;

已知先序序列和后序序列不能确定一棵唯一的二叉树。

前序遍历:根左右
中序遍历:左根右
后序遍历:左右根

根据前序和中序遍历输出先序遍历

思路:
前序遍历第一个字母A,必定是这树的根节点。
在中序遍历中找到A的位置,把中序遍历分成两个子树。
取前序遍历中的第二个点B,在分成的两个子树中找到B的位置,再次分成两个子树。
直到分出子树为止。( l == r )
回溯到A点,对右子树进行同样的操作。

input:
DBACEGF (前序)
ABCDEFG (中序)
output:
ACBFGED (后序)

code:

#include<iostream>
#include<cstring>
using namespace std;
const int N = 10010;
char a[N],b[N];   // a->前序   b->中序
int idx;
void build(int l,int r){
	if(l > r) return;
	int u = strchr(b,a[idx])-b;  //a[idx]在 b数组的下标位置 
	idx++;
	build(l,u-1);     // 左子树区间 
	build(u+1,r);     // 右子树区间
	cout << b[u]; 
} 
int main(){
	scanf("%s%s",&a,&b);
	build(0,strlen(a)-1);
	return 0;
}

根据后序和中序遍历输出先序遍历

思路:
与根据前序和中序遍历输出先序遍历相类似;
只是在后序遍历中根结点在末尾;
且把每次递归中“根结点”输出即为前序遍历;

分析+code 传送门

IMPROVE

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值