根据题意,先回顾一下课堂上讲的二推一的方法
只要知道其中任意两种遍历的顺序,我们就可以推断出剩下的一种遍历方式的顺序,这里我们只是以:知道前序遍历和中序遍历,推断后序遍历作为例子,其他组合方式原理是一样的。要完成这个任务,我们首先要利用以下几个特性:
特性A,对于前序遍历,第一个肯定是根节点;
特性B,对于后序遍历,最后一个肯定是根节点;
特性C,利用前序或后序遍历,确定根节点,在中序遍历中,根节点的两边就可以分出左子树和右子树;
特性D,对左子树和右子树分别做前面3点的分析和拆分,相当于做递归,我们就可以重建出完整的二叉树;
我们以一个例子做一下这个过程,假设:
前序遍历的顺序是: CABGHEDF
中序遍历的顺序是: GHBACDEF
第一步,我们根据特性A,可以得知根节点是C,然后,根据特性C,我们知道左子树是:GHBA,右子树是:DEF。
C
/
GHBA DEF
第二步,取出左子树,左子树的前序遍历是:ABGH,中序遍历是:GHBA,根据特性A和C,得出左子树的父节点是A,并且A没有右子树。
C
/
A DEF
/
GBH
第三步,使用同样的方法,前序是BGH,中序是GBH,得出父节点是B,G和H分别是左右节点。
C
/
A DEF
/
B
/
G H
第四步,回到右子树,它的前序是EDF,中序是DEF,依然根据特性A和C,得出父节点是E,左右节点是D和F。
C
/
A E
/ /
B D F
/
G H
到此,我们得到了这棵完整的二叉树,因此,它的后序遍历就是:GHBADFEC。
原文链接:https://blog.csdn.net/droidphone/article/details/38063897
参考大神:https://blog.csdn.net/qq_45757722/article/details/106106514
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//二叉树节点
typedef struct BTNode
{
char data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
//递归建立子树
BTNode *ReBuild(char *PreStart,char *PreLast,char *IStart,char *ILast)
{
BTNode *root;//创建一个根节点
root=(BTNode*)malloc(sizeof(BTNode));
root->data=PreStart[0];//前序的第一个即为该子树的根节点
root->lchild=NULL;//先制空
root->rchild=NULL;
if(PreStart==PreLast)//判断是否建立完毕
{
if(IStart==ILast)
{
return root;
}
}
char *temp=IStart;//记录目前中序头
while((*IStart!=root->data)&&(IStart<ILast))//找到根节点
{
IStart++;
}
int leftnum=0;
leftnum=IStart-temp;//找到左子树的数目
if(leftnum>0)//递归
{
root->lchild=ReBuild(PreStart+1,PreStart+leftnum,temp,IStart-1);
}
if(leftnum<PreLast-PreStart)
{
root->rchild=ReBuild(PreStart+leftnum+1,PreLast,IStart+1,ILast);
}
return root;
}
//建立二叉树
BTNode *Build(char *Pretree,char *Itree,int len)
{
return ReBuild(Pretree,Pretree+len-1,Itree,Itree+len-1);
}
//后序遍历
void Postorder_traversal(BTNode *tree)
{
if(tree->lchild) Postorder_traversal(tree->lchild);
if(tree->rchild) Postorder_traversal(tree->rchild);
if(tree) printf("%c",tree->data);
}
int main()
{
char Pretree[100];
char Itree[100];
int len=0;
scanf("%s",Pretree);
scanf("%s",Itree);
len=strlen(Pretree);
BTNode *tree;
tree=Build(Pretree,Itree,len);
Postorder_traversal(tree);
return 0;
}