事实上,一个中序遍历的算法中入栈的过程中,如果你把每个入栈的结点保存起来,你会发现这些结点就是先序遍历的结果,同样,出栈就是中序遍历,如下图
- 核心算法
先序遍历的第一个结点一定是根结点,也是后序遍历的最后一个结点,找到它在中序中的位置 i ,那么 i 的左边就是左子树,右边是右子树,递归的求解左右两边 - 代码
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
//
int pre[6]={1,2,3,4,5,6};//先序遍历数组
int in[6]={3,2,4,1,6,5};//中序遍历 数组
int post[6]={0};//后序遍历数组
void CreatePost(int first,int mid,int last,int n)
{
printf("------%d-------\n",first);
if(n==0){
return;
}
if(n==1)
{
post[last]=pre[first];
return;
}
int root=pre[first];
post[last+n-1]=root;
int i;
for(i=0;i<6;i++)
{
if(root==in[i+mid])
break;
}
int L=i;
int R=n-L-1;
CreatePost(first+1,mid,last,L);
CreatePost(first+L+1,mid+L+1,last+L,R);
}
int main(int argc, char** argv) {
CreatePost(0,0,0,6);
for(int i=0;i<6;i++)
printf("%d ",post[i]);
return 0;
}