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

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程:已知二叉树前序和中序,如何求出后序遍历?相关的知识,希望对你有一定的参考价值。

题目

已知二叉树前序为  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语言编程学习基地

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

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

编程学习视频分享:

 

 

以上是关于C语言编程:已知二叉树前序和中序,如何求出后序遍历?的主要内容,如果未能解决你的问题,请参考以下文章

已知二叉树前序和中序,求二叉树。

已知二叉树前中序遍历,求后序 / 已知二叉树中后序遍历,求前序

已知一个二叉树的先序序列和中序序列,怎么求它的后序序列

怎么根据二叉树的前序,中序,确定它的后序

已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C++的,要在TC环境下能运行的,各位能人帮帮忙吧

[codevs1029]遍历问题