c 打印二叉树_#图解 PTA「6-9 二叉树的遍历」

b16be72e1fa30d2fc83acc32d303008d.png

PTA是浙江大学设计类实验辅助教学平台。

43143fb1c4784d1608bba62c0dbf0e86.png

题目描述:

本题要求给定二叉树的4种遍历。

函数接口定义:

void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("Inorder:");    InorderTraversal(BT);    printf("n");
    printf("Preorder:");   PreorderTraversal(BT);   printf("n");
    printf("Postorder:");  PostorderTraversal(BT);  printf("n");
    printf("Levelorder:"); LevelorderTraversal(BT); printf("n");
    return 0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):

60e6d874623a3a83667a5797c10a2199.png
Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H

fdf6cc7fb0afab339fcf9b2a975452cf.png

解题思路:

前、中、后序都不值一提。

唯一需要注意的是层次遍历。

要进行层次遍历,需要建立一个循环队列

66212d74ab8208c7119c5b682d8cd941.png
层次遍历

层次遍历

void LevelorderTraversal( BinTree BT ){
    if (!BT) return;
    BinTree que[1000],p;
    int front=0,rear=0;
    que[rear++]=BT;
    while (front!=rear)
    {
        p=que[front++];
        printf(" %c",p->Data);
        if (p->Left) que[rear++]=p->Left;
        if (p->Right) que[rear++]=p->Right;

    }
}

b83485a45e7f1d04533b845f830edc3a.png

我们不妨多做一步,创建二叉树,亲自看到运行的结果。

我们将题目中CreateBinTree()稍稍做一下修改。

void CreatBinTree(BinTree &BT);

void CreatBinTree(BinTree &BT){
    
        char ch;
        scanf("%c",&ch);
        if (ch=='#')
        {
            BT=NULL;
        }
        else
        {
            BT=(BinTree)malloc(sizeof(BinTree));
            BT->Data=ch;
            CreatBinTree(BT->Left);
            CreatBinTree(BT->Right);
        }
}

完整代码

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

void CreatBinTree(BinTree &BT); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

int main()
{
    BinTree BT;
    CreatBinTree(BT);
    printf("Inorder:");    InorderTraversal(BT);    printf("n");
    printf("Preorder:");   PreorderTraversal(BT);   printf("n");
    printf("Postorder:");  PostorderTraversal(BT);  printf("n");
    printf("Levelorder:"); LevelorderTraversal(BT); printf("n");
    return 0;
}
/* 你的代码将被嵌在这里 */
void InorderTraversal( BinTree BT ){

    if (!BT) return;
    InorderTraversal(BT->Left);
    printf(" %c",BT->Data);
    InorderTraversal(BT->Right);
}

void PreorderTraversal( BinTree BT ){

    if (!BT) return;
    printf(" %c",BT->Data);
    PreorderTraversal(BT->Left);
    PreorderTraversal(BT->Right);
}

void PostorderTraversal( BinTree BT ){
    if (!BT) return;
    PostorderTraversal(BT->Left);
    PostorderTraversal(BT->Right);
    printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT ){
    if (!BT) return;
    BinTree que[1000],p;
    int front=0,rear=0;
    que[rear++]=BT;
    while (front!=rear)
    {
        p=que[front++];
        printf(" %c",p->Data);
        if (p->Left) que[rear++]=p->Left;
        if (p->Right) que[rear++]=p->Right;

    }
}

void CreatBinTree(BinTree &BT){
    
        char ch;
        scanf("%c",&ch);
        if (ch=='#')
        {
            BT=NULL;
        }
        else
        {
            BT=(BinTree)malloc(sizeof(BinTree));
            BT->Data=ch;
            CreatBinTree(BT->Left);
            CreatBinTree(BT->Right);
        }
}

输入

输入的时候略有讲究:

我画一张图,让你看就懂

f39f30f1054a6674cea5fbae6631a373.png

所以我们只需要先序遍历二叉树,确定输入的顺序。

bce991e151c3d40ffcd4df1eda4c15d5.png
先序遍历

输入顺序:

ABD##FE###CG#H##I##

我们来运行一把

0cf37910823820ebe85a50565bed0539.png

很好,这就是我心目中想要的结果。


e282a8ee76ba4320172e211384d534c4.png

编译器

C(gcc)

提交代码

void InorderTraversal( BinTree BT ){

    if (!BT) return;
    InorderTraversal(BT->Left);
    printf(" %c",BT->Data);
    InorderTraversal(BT->Right);
}

void PreorderTraversal( BinTree BT ){

    if (!BT) return;
    printf(" %c",BT->Data);
    PreorderTraversal(BT->Left);
    PreorderTraversal(BT->Right);
}

void PostorderTraversal( BinTree BT ){
    if (!BT) return;
    PostorderTraversal(BT->Left);
    PostorderTraversal(BT->Right);
    printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT ){
    if (!BT) return;
    BinTree que[1000],p;
    int front=0,rear=0;
    que[rear++]=BT;
    while (front!=rear)
    {
        p=que[front++];
        printf(" %c",p->Data);
        if (p->Left) que[rear++]=p->Left;
        if (p->Right) que[rear++]=p->Right;

    }
}

运行截图

0ff54f67d63788340b5b1bdc40d940ac.png
准确输出

提交结果

191bf5cbbd528ceb89cf637620c95a7c.png

Nice!Nice!Nice!

搞定!

e829827ee69d9586a6ada6cc57f968ca.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值