楔子
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~




1052

被折叠的 条评论
为什么被折叠?



