数据结构实验之求二叉树后序遍历和层次遍历(根据前序中序还原二叉树)

数据结构实验之求二叉树后序遍历和层次遍历

Time Limit: 1000MS Memory limit: 65536K

题目描述

 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历。

输入

 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。

输出

每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列

示例输入

2
abdegcf
dbgeafc
xnliu
lnixu

示例输出

dgebfca
abcdefg
linux
xnuli


前序遍历也叫先序遍历。前序遍历有一个特点,第一个节点为二叉树的根节点,根据这个根节点可以在中序序列中找到根节点的左右子树。
例如:一个二叉树前序序列是:a b d e g c f,中序序列是:d b g e a f c,则根据前序序列第一个数据为a,在中序序列中可以看出此二叉树的
左子树为:d b g e ,右子树为:f c ,此时就可以用递归解决了,前序序列指针往后移动一个位置即为左子树的根节点,前序序列指针往后移动左子树节点个数加一个位置即为
右子树的根节点的位置。下面为具体的代码实现:
#include <stdio.h>
#include <stdlib.h>

typedef struct node//此处不解释
{
    char data;
    struct node *lchild,*rchild;
}node,*nodeptr;


char xian[55],zhong[55];//定义两个全局数组
//xian[]为前序序列,zhong[]为中序序列

struct node *Creat(char *xian,char *zhong,int n)
{//根据前序遍历和中序遍历建立二叉树,n为二叉树包含节点个数
    struct node *T;
    int k;
    char *p;
    if(n<=0)return NULL;//当其包含结点数为0,返回
    T=(struct node *)malloc(sizeof(struct node));
    T->data=*xian;
    for(p=zhong;p<zhong+n;p++)
    {
        if(*xian==*p)
            break;
    }
    k=p-zhong;
    T->lchild=Creat(xian+1,zhong,k);
    T->rchild=Creat(xian+k+1,p+1,n-k-1);
    return T;
}


int treelevel(struct node *T,int level)
{//层次遍历输出函数
    if(!T||level<0)
        return 0;
    if(level==0)
    {
        printf("%c",T->data);
        return 1;
    }
    return treelevel(T->lchild,level-1)+treelevel(T->rchild,level-1);
}


void level1(struct node *T)
{//二叉树层次控制函数
    int i=0;
    for(i=0;;i++)
    {
        if(!treelevel(T,i))
            break;
    }
}


void lrd(struct node *T)
{//后序遍历输出函数
    if(T)
    {
        lrd(T->lchild);
        lrd(T->rchild);
        printf("%c",T->data);
    }
}


int main()
{
    int n,i;
    struct node *T;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",xian);
        scanf("%s",zhong);
        i=strlen(zhong);
        T=Creat(xian,zhong,i);
        lrd(T);
        printf("\n");
        level1(T);
        printf("\n");
    }
    return 0;
}

下面为本人画出的前几步的运行步骤:

水平有限,不喜勿喷,原创辛苦,转载请注明出处*>_<*
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值