PTA 数据结构 二叉树的非递归遍历 pintia

本文介绍了在PTA平台上解决6-3二叉树非递归遍历的问题,包括中序、前序和后序遍历。作者分享了在编程过程中遇到的难点,如误将非递归理解为递归,忽视了根节点可能为NULL的情况,以及因函数名重复导致的错误。最后,作者提供了问题解决方案,并提醒读者注意细节和测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PTA 二叉树的非递归遍历

这一题写的我快要吐了,讲述一下心酸历程。

6-3 二叉树的非递归遍历 (10 分)
本题要求用非递归的方法实现对给定二叉树的 3 种遍历。

函数接口定义:
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
其中BinTree结构定义如下:


typedef struct TNode Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
int flag;
};
要求 3 个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。


此外,裁判程序中给出了堆栈的全套操作,可以直接调用。


裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef enum { false, true } bool;


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


/
------堆栈的定义-------
/
typedef Position SElementType;
typedef struct SNode PtrToSNode;
struct SNode {
SElementType Data;
PtrToSNode Next;
};
typedef PtrToSNode Stack;


/
裁判实现,细节不表 /
Stack CreateStack();
bool IsEmpty( Stack S );
bool Push( Stack S, SElementType X );
SElementType Pop( Stack S ); /
删除并仅返回S的栈顶元素 /
SElementType Peek( Stack S );/
仅返回S的栈顶元素 /
/
----堆栈的定义结束-----/


BinTree CreateBinTree(); /
裁判实现,细节不表 /
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );


int main()
{
BinTree BT = CreateBinTree();
printf(“Inorder:”); InorderTraversal(BT); printf("\n");
printf(“Preorder:”); PreorderTraversal(BT); printf("\n");
printf(“Postorder:”); PostorderTraversal(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

        这道题目简直是丧尽天良,惨绝人寰。


        一开始题目看错了,以为就是简单的递归(没看见“非”字)遍历,马上就莽。一波只过了2个案例,重新审题发现要非递归。
        既然是非递归,那无非就是栈,一看题目果然有栈。好的,再扫了一眼题目,节点有个int参数flag,突然想起老师上课说的按照相反顺序入栈,然后记一个bool,1代表visit过了,0代表没有,然后马上又打。打到一半发现这个flag走了一次之后肯定就不是0了,有可能初始化就不是0(恕我没学好,我也不知道,感觉没有初始化函数他就会随机,事实上我并不知道会怎么样)。那我还有两个要遍历的就走不了。


        遂重写。换了个思路,显然先序遍历是容易的,一个while就能搞定,剩下两个分别是 左右中 左中右,想到先一直找左,没有了再根据情况判断下一个是什么。
        上代码,细节不说,看码。

void InorderTraversal( BinTree BT ){
   
   
    Stack s=CreateStack();
    if(BT!=NULL)
        Push(s,BT);
    BinTree now
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值