序言
2023.11.18 本人菜鸡目前大二,第1次写csdn博客,本次文章记录学习遇到的问题,后序会跟进问题的答案。
问题内容
该题目中的层序遍历答案用了四个不应该编译成功的操作(或许我真的眼瞎了😭)
四个有关队列的操作:Queue Q,Q = CreatQueue(),AddQ()和DeleteQ()。但是在该题目部分并没有发现定义队列的部分。并且也不是STL的队列容器。在pta上可以成功编译并且答案正确,而在VS和Devc中四个操作在头文件相同的情况下,无法编译。
下附题目:
题目
本题要求给定二叉树的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
层序遍历的测试代码:
void LevelorderTraversal( BinTree BT ){
Queue Q;
BinTree T;
if(!BT) return;
Q = CreatQueue();
AddQ(Q,BT);
while(!IsEmpty(Q)){
T = DeleteQ(Q);
printf(" %c",T->Data);
if(T->Left) AddQ(Q,T->Left);
if(T->Right) AddQ(Q,T->Right);
}
分割线-----------------------------------------------2023/11/20----------------------------------------------------------
和几个同学讨论没有结果,那就用自己的方法AC
另起炉灶找办法
我们可以利用数组模拟队列,构造结构体队列
整体思路:
①.先将根节点入队queue[0]
②.while(当队列不空时)
{
指挥节点到queue[++front],然后输出node对应字符,并出队;
指挥节点的左右儿子分别入队;
}
这样每次有一个指挥节点被输出,都会有该指挥节点的左右儿子入队(如果有左右儿子)
void LevelorderTraversal( BinTree BT )//层序遍历
{
if(BT==NULL) return;//空树,直接返回
else
{
BinTree node,queue[1005];//node为指挥节点,queue为结构体数组,数组模拟队列
int rear=-1,front=-1;
queue[++rear]=BT;
while(rear!=front)//队列不空
{
node=queue[++front];//指挥节点等于队头节点
printf(" %c",node->Data);//输出队列第一个节点的数据域
//指挥节点左儿子右儿子依次入栈(如果有的话)
if(node->Left!=NULL) queue[++rear]=node->Left;
if(node->Right!=NULL) queue[++rear]=node->Right;
}
}
}