C语言编程:已知二叉树前序和中序,如何求出后序遍历?
题目
已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGDBHECA
大体思路
又先序得出根,先序的根后为左树一部分,我们再在中序序列里找到先序的根,此处之前即为左树(可以画图好好理解下),此处之后为右树。然后就是不断递归即可。
代码
typedef struct Node{char data;struct Node *Lchild;struct Node *Rchild;}BiTNode,*Bitree;void PreTree(Bitree T) //后序输出树{ if(T==NULL) return;PreTree(T->Lchild);PreTree(T->Rchild);printf("%c",T->data);}char pre[MAX];char mid[MAX];int MidFind(int left,int right,char MID){for(int i=left;i<=right;i++){if(mid[i]==MID) return i;}return 0;}void Create(int left,int right,int *i,BiTNode **T) //此题建立树得先将孩子结点赋NULL,因为没有用户输入以确定什么时候把某个具体的结点赋为NULL{//这是第一种创建二叉树的写法(二级指针法)//这种感觉是把指针送进函数处理*T=(Bitree)malloc(sizeof(BiTNode));(*T)->data=pre[*i];(*T)->Lchild=NULL;(*T)->Rchild=NULL;(*i)++;int midnumber = MidFind(left,right,(*T)->data);if(midnumber>left){Create(left,midnumber-1,i,(&((*T)->Lchild)));}if(midnumber<right){Create(midnumber+1,right,i,(&((*T)->Rchild)));}}BiTNode* Create2(int left,int right,int *i){//第二中创建方式(注意返回!!!)//这种感觉是把指针让函数处理(自己不进去)BiTNode *T;T=(Bitree)malloc(sizeof(BiTNode));T->data=pre[*i];T->Lchild=NULL;T->Rchild=NULL;(*i)++;int midnumber = MidFind(left,right,T->data);if(midnumber>left){T->Lchild = Create2(left,midnumber-1,i);}if(midnumber<right){T->Rchild = Create2(midnumber+1,right,i);}return T;}int main(){memset(pre,0,MAX);memset(mid,0,MAX);gets(pre);gets(mid);int left,right,len,i=0;len=strlen(pre);left=0;right=len-1;BiTNode *T=(Bitree)malloc(sizeof(BiTNode)); //这里可以不用分配空间,因为在函数里会进行分配Create(left,right,&i,&T);PreTree(T);return 0;}
不懂就问,对于准备学习编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
