程序代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> struct BTree { char n; BTree *l; BTree *r; }; char put[100];//用于保存后序序列 int iput = 0; /*先在前缀中确定子树树根,再在中序中找到这个树根的位置,并判断左右孩子的情况*/ void greateBT(BTree *root, char *nlr, char *lnr, int n) { if(n) { //因为要后序输出,所以左右子树的创建顺序不能变动。 root->n = *nlr; char *p = strchr(lnr,root->n);//p保存根在中序序列中的位置 int ln = p-lnr;//左子树的序列长度 if(ln){ root->l = (BTree*) calloc(1,sizeof(BTree)); greateBT(root->l, nlr+1, lnr, ln);//创建左子树 } int rn = n-1-ln; if(rn){ root->r = (BTree*) calloc(1,sizeof(BTree)); greateBT(root->r, p-lnr+nlr+1, p+1, rn);//创建右子树 } } put[iput++] = root->n;//为后序输出做准备 } int main() { char nlr[10];//先序序列 char lnr[10];//中序序列 printf("%s\n","输入先序和中序"); scanf("%s%s",nlr,lnr); BTree *root = (BTree*) calloc(1,sizeof(BTree)); greateBT(root,nlr,lnr,strlen(nlr)); printf("%s\n",put); return 0; }
迭代的是人,递归的是神。