noj18建立二叉树的二叉链表

在这里插入图片描述
根据题意,先回顾一下课堂上讲的二推一的方法

只要知道其中任意两种遍历的顺序,我们就可以推断出剩下的一种遍历方式的顺序,这里我们只是以:知道前序遍历和中序遍历,推断后序遍历作为例子,其他组合方式原理是一样的。要完成这个任务,我们首先要利用以下几个特性:
特性A,对于前序遍历,第一个肯定是根节点;
特性B,对于后序遍历,最后一个肯定是根节点;
特性C,利用前序或后序遍历,确定根节点,在中序遍历中,根节点的两边就可以分出左子树和右子树;
特性D,对左子树和右子树分别做前面3点的分析和拆分,相当于做递归,我们就可以重建出完整的二叉树;
我们以一个例子做一下这个过程,假设:
前序遍历的顺序是: CABGHEDF
中序遍历的顺序是: GHBACDEF
第一步,我们根据特性A,可以得知根节点是C,然后,根据特性C,我们知道左子树是:GHBA,右子树是:DEF。
C
/
GHBA DEF
第二步,取出左子树,左子树的前序遍历是:ABGH,中序遍历是:GHBA,根据特性A和C,得出左子树的父节点是A,并且A没有右子树。
C
/
A DEF
/
GBH
第三步,使用同样的方法,前序是BGH,中序是GBH,得出父节点是B,G和H分别是左右节点。
C
/
A DEF
/
B
/
G H
第四步,回到右子树,它的前序是EDF,中序是DEF,依然根据特性A和C,得出父节点是E,左右节点是D和F。
C
/
A E
/ /
B D F
/
G H
到此,我们得到了这棵完整的二叉树,因此,它的后序遍历就是:GHBADFEC。
原文链接:https://blog.csdn.net/droidphone/article/details/38063897

参考大神:https://blog.csdn.net/qq_45757722/article/details/106106514

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//二叉树节点
typedef struct BTNode
{
    char data;
    struct BTNode *lchild;
    struct BTNode *rchild;
}BTNode;
//递归建立子树
BTNode *ReBuild(char *PreStart,char *PreLast,char *IStart,char *ILast)
{
    BTNode *root;//创建一个根节点
    root=(BTNode*)malloc(sizeof(BTNode));
    root->data=PreStart[0];//前序的第一个即为该子树的根节点
    root->lchild=NULL;//先制空
    root->rchild=NULL;
    if(PreStart==PreLast)//判断是否建立完毕
    {
        if(IStart==ILast)
        {
            return root;
        }
    }
    char *temp=IStart;//记录目前中序头
    while((*IStart!=root->data)&&(IStart<ILast))//找到根节点
    {
        IStart++;
    }
    int leftnum=0;
    leftnum=IStart-temp;//找到左子树的数目
    if(leftnum>0)//递归
    {
        root->lchild=ReBuild(PreStart+1,PreStart+leftnum,temp,IStart-1);
    }
    if(leftnum<PreLast-PreStart)
    {
        root->rchild=ReBuild(PreStart+leftnum+1,PreLast,IStart+1,ILast);
    }
    return root;
}
//建立二叉树
BTNode *Build(char *Pretree,char *Itree,int len)
{
    return ReBuild(Pretree,Pretree+len-1,Itree,Itree+len-1);
}
//后序遍历
void Postorder_traversal(BTNode *tree)
{
    if(tree->lchild) Postorder_traversal(tree->lchild);
    if(tree->rchild) Postorder_traversal(tree->rchild);
    if(tree) printf("%c",tree->data);
}
int main()
{
    char Pretree[100];
    char Itree[100];
    int len=0;
    scanf("%s",Pretree);
    scanf("%s",Itree);
    len=strlen(Pretree);
    BTNode *tree;
    tree=Build(Pretree,Itree,len);
    Postorder_traversal(tree);
    return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值