vlambda博客
学习文章列表

C语言编程:已知二叉树前序和中序,如何求出后序遍历?


题目

已知二叉树前序为  ABDFGCEH  后序序列为 BFDGACEH  ,要求输出后序遍历为 FGDBHECA

大体思路

又先序得出根,先序的根后为左树一部分,我们再在中序序列里找到先序的根,此处之前即为左树(可以画图好好理解下),此处之后为右树。然后就是不断递归即可。

代码

#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 100typedef 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;}


不懂就问,对于准备学习编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!