C/C++教程

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

本文主要是介绍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语言编程:已知二叉树前序和中序,如何求出后序遍历?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!