利用二叉树中序及先序遍历确定该二叉树的后序序列
中序遍历: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
*/
欢迎指正
本文详细介绍了如何使用二叉树的中序和前序遍历来确定其后序遍历序列,通过具体实例和两种代码实现方式,帮助读者深入理解二叉树遍历的原理。

6189

被折叠的 条评论
为什么被折叠?



