已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGDBHECA
又先序得出根,先序的根后为左树一部分,我们再在中序序列里找到先序的根,此处之前即为左树(可以画图好好理解下),此处之后为右树。然后就是不断递归即可。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 100 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; }
不懂就问,对于准备学习编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
C语言C++编程学习交流圈子,QQ群:614504899【点击进入】微信公众号:C语言编程学习基地
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习视频分享: