(先序+中序建树)2137数据结构实验之求二叉树后序遍历和层次遍历

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


Problem Description

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

Input

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

Output

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

Example Input

2
abdegcf
dbgeafc
xnliu
lnixu

Example Output

dgebfca
abcdefg
linux
xnuli

解题感触
这道题做了一下午,~~(>_<)~~
建立二叉树,层次遍历第一次接触,有些难度。上网搜了一系列的代码,发现自己一个人也可以把问题整得很透彻,坚持。


代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BiNode{
    char data;
    struct Binode *lchild,*rchild;
}BiNode,*BiTree;
BiTree CreatBiTree(int n,char *str1,char *str2)
//由二叉树的先序遍历序列和中序遍历序列建立二叉树,其中n表示二叉树的长度,str1表示二叉树在先序遍历序列中开始的位置,str2表示二叉树在中序遍历序列中开始的位置
{
    BiTree T=(BiTree)malloc(sizeof(BiNode));
    int i;
    if(n==0)
        T=NULL;
    else{
       T->data=str1[0];//找到根节点(先序遍历序列的第一位)
       for(i=0;i<n;i++)//在中序遍历序列中找到根节点的位置
       {
           if(str2[i]==str1[0])
            break;
       }
       T->lchild=CreatBiTree(i,str1+1,str2);//递归遍历(左子树的长度,左子树在先序遍历序列中开始的位置,左子树在中序遍历序列中开始的位置)
       T->rchild=CreatBiTree(n-i-1,str1+i+1,str2+i+1);//(右子树的长度,右子树在先序遍历序列中开始的位置,右子树在中序遍历序列中开始的位置)
    }
    return T;
}
void PostOrderTraverse(BiTree T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%c",T->data);
    }
}
void LevelTraverse(BiTree T,int n)
{
    BiTree p[51];//用指针来控制
    int front=0,rear=1,i=0;
    p[front]=T;
   // while(front < rear)//每一个p[f]都是子树树根
   while(i!=n)
    {
        if(p[front])//因为为二叉树所以最多有2个子树,且只有当二叉树不为空时才可能有数据,为空时即可跳过,不打印
        {
            printf("%c",p[front]->data);
            p[rear++] = p[front]->lchild;
            p[rear++] = p[front]->rchild;
            i++;
        }
        front++;
    }
}
int main()
{
    int t;
    char str1[51],str2[51];
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        int n;
        BiTree T;
        scanf("%s%s",str1,str2);
        n=strlen(str1);
        T=CreatBiTree(n,str1,str2);//建立二叉树
        PostOrderTraverse(T);
        printf("\n");
        LevelTraverse(T,n);
        printf("\n");
    }
    return 0;
}

老师讲后,修改的代码(建立二叉树处,层次遍历处)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BiNode{
    char data;
    struct Binode *lchild,*rchild;
}BiNode,*BiTree;
BiTree CreatBiTree(int n,char *str1,char *str2)
{
    BiTree T=(BiTree)malloc(sizeof(BiNode));
    int i;
    if(n<=0)
        T=NULL;
    else{
       T->data=str1[0];
      /* for(i=0;i<n;i++)
       {
           if(str2[i]==str1[0])
            break;
       }*/
       for(i=0;str2[i]!=str1[0];i++);
       T->lchild=CreatBiTree(i,str1+1,str2);
       T->rchild=CreatBiTree(n-i-1,str1+i+1,str2+i+1);
    }
    return T;
}
void PostOrderTraverse(BiTree T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%c",T->data);
    }
}
void LevelTraverse(BiTree T,int n)
{
    BiTree p[51];//用指针来控制
    int f=0,r=0;
    p[r++]=T;
    while(f!=r)//每一个p[f]都是子树树根
    {
        printf("%c",p[f]->data);
        if(p[f]->lchild)
            p[r++] = p[f]->lchild;
        if(p[f]->rchild)
            p[r++] = p[f]->rchild;
        f++;
    }
}
int main()
{
    int t;
    char str1[51],str2[51];
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        int n;
        BiTree T;
        scanf("%s%s",str1,str2);
        n=strlen(str1);
        T=CreatBiTree(n,str1,str2);//建立二叉树
        PostOrderTraverse(T);
        printf("\n");
        LevelTraverse(T,n);
        printf("\n");
    }
    return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37275680/article/details/76922186
文章标签: 二叉树
个人分类: 数据结构 - 二叉树
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭