PTA 6-08 二叉树的遍历

楔子

        okay,被《数据结构》统治的大家,毫无疑问地我们学校(ZZULI)也是给我们在PTA上准备一整套的题目。Now,现在我来给大家分享一下对这套题目的见解和问题,请看客老爷们多多支持,也指出不足之处。


题目要求

                                                                                                        作者 陈越    单位 浙江大学

本题要求给定二叉树的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; 
} /* 你的代码将被嵌在这里 */

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

                                              

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

代码长度限制                                                                                                                16 KB

时间限制                                                                                                                        400 ms

内存限制                                                                                                                        64 MB


 完整代码实现

void InorderTraversal( BinTree BT ) //中序
{
    if(BT==NULL)
        return;
    InorderTraversal(BT->Left);
    printf(" %c",BT->Data);
    InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ) //先序
{
    if(BT==NULL)
        return;
    printf(" %c",BT->Data);
    PreorderTraversal(BT->Left);
    PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ) //后序
{
    if(BT==NULL)
        return;
    PostorderTraversal(BT->Left);
    PostorderTraversal(BT->Right);
    printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT ) //层序
{
/*
层序遍历就是一层一层地输出,定义两个BinTree数组,a和b
a、b数组都是存的一层的所有节点,且a为输出的当前层,b为下一层
*/
    if(!BT)
        return;
    BinTree a[10000];
    a[0]=BT;
    int len=1;
    while(1){
        if(len==0)
            return;
        int pos=0;
        BinTree b[10000];
       for(int i=0;i<len;i++){
           if(a[i]!=NULL)
               printf(" %c",a[i]->Data);
           if(a[i]->Left!=NULL)
               b[pos++]=a[i]->Left;
           if(a[i]->Right!=NULL)
               b[pos++]=a[i]->Right;
       }
        len=pos;
        for(int i=0;i<len;i++)
            a[i]=b[i];
    }
}


代码详细分析

        本题考察的是关于树的前序,中序,后序,层级遍历。在这里用到了递归的方法来进行遍历实现。关于树的遍历基础知识这里就不再赘述,值得一提的是,这里关于树的层次遍历中,我们用到了两个数组,定义两个BinTree数组a和b,a、b数组都是存的一层的所有节点,且a为输出的当前层,b为下一层。这样就实现了关于树的层次遍历。


结语

        之所以写下了这篇博客介绍和分享其中我的见解与错误细节,也是想帮助后来的所需者提供一个思路和建议,不至于再手足无措。当然发出来这篇博客,如有不足之处或者哪里有问题也请看客老爷们指点一二!题目集持续更新ing~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值