二叉树的先序中序后序遍历推理

13 篇文章 0 订阅

不难理解,中序是关键点,它是用于区别左右子树。

而先序和后序都是用来查找根节点的。

1/先序:第一个元素一定是根结点。

2/后序:最后一个节点一定是根结点。

解决问题的清晰点:可将先序和后序的查找定格在某个层次,使用递归的方式,将复杂的问题,分解成相似的子问题进行处理。

上代码:

#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<vector> 
using namespace std;

void preT(int * inorder, int * postorder,int len){//m,b已知中序和后序

	if(len==0){
		return ;
	}
	int idx=0;
	cout<<postorder[len-1]<<"	";
	for(idx=0;postorder[len-1]!=inorder[idx];idx++);
	//左子树 
	preT(inorder,postorder,idx);
	//右子树
	preT(inorder+idx+1,postorder+idx,len-idx-1);
	
} 
void postT(int * preorder,int * inorder,int len){//已知先序和中序
	if(len==0) return ;
	int rootindex=0;
	int root=preorder[0];
	
	for(rootindex=0;preorder[0]!=inorder[rootindex];rootindex++);
	//左子树
	postT(preorder+1,inorder,rootindex);
	//右子树 
	postT(preorder+rootindex+1,inorder+rootindex+1,len-rootindex-1);
	cout<<preorder[0]<<"	";
}
int main(){
	int a[8]={1,2,3,4,6,7,5,8};
    int m[8]={2,1,6,4,7,3,8,5};
	int b[8]={2,6,7,4,8,5,3,1};
	preT(m,b,8);
	cout<<endl;
	postT(a,m,8);
} 
/*
1       2       3       4       6       7       5       8
2       1       6       4       7       3       8       5
2       6       7       4       8       5       3       1
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值