#include<bits/stdc++.h>
using namespace std;
void printTree(char *pre,char *in,int length){//传入两串本轮起址及长度
if(length<1)return; //全部字母已经输出完成
int idx=0; //中序遍历偏移值初始化为无偏移,注意每次传进来的in与pre起点是不同的
while(in[idx]!=pre[0])idx++; //前序pre[0]就是当前子树的树根,对应中序idx此结点的位置,idx左边是左树,右边是右树
printTree(pre+1,in,idx); //递归传入前序下一值,原中序,偏移值亦即区间长,输出左儿
printTree(pre+idx+1,in+idx+1,length-idx-1);//递归传入前中序偏移IDX+1后的值,长度相应减小,输出右儿子
printf("%c",pre[0]); //因为是后序输出,所以最后再输出当前子树根
}
int main(){
char Pre[1000],In[10000]; //定义前中缀表达式
gets(Pre);gets(In); //输入前中缀表达式
int len=strlen(Pre); //得到前缀表达式长度
printTree(Pre,In,len); //传入两串起址及长度求解后缀表达式
return 0;
}
/*
前序遍历:GDAFEMHZ
中序遍历:ADEFGHMZ
后序遍历:AEFDHZMG
以前中为例分析:前序开头是G,则G是树根,在中序遍历中,G左边的ADEF是G左子树,HMZ是G右子树
前序中第二个是D,则由中序区间ADEF可知,A是D左子树,EF是D右子树
前序中第三个是A,由中序知没有儿子
前度中第四个是F,由中序知E是其左儿子,没有右儿
前序中第五个是E,由中序知没有儿子
前序中第六个是M,由中序知左儿是H,右儿是Z
前序中第七个是H,由中序知没有左右儿
前序中第八个是Z,由中序知没有左右儿
*/
3树-3前中序变后序
最新推荐文章于 2022-08-02 15:11:42 发布