取名字好难-_- 2022-05-12 21:42 采纳率: 58.3%
浏览 337
已结题

二叉树非递归遍历算法

栈及二叉树的非递归遍历
本题要求根据相关数据类型的定义,写出相关的函数实现,包括:

栈的初始化函数、取栈顶元素,栈是否为空,push和pop函数由裁判程序给出,无需再写。
二叉树的先序遍历函数和中序遍历函数,要求使用非递归算法。后序遍历的非递归算法由裁判程序给出,无需再写。
函数接口定义:

在这里描述函数接口:
#include <iostream>
#define MAXSIZE 100 //顺序栈存储控件的初始分配量
#define OK 1
#define ERROR 0
#define OVERFLOW -1
using namespace std;
typedef int Status;
typedef char TElemType;
typedef struct BiTNode{
    TElemType Data;
    struct BiTNode *lchild,*rchild;
    int flag;//用于非递归后序遍历
}BiTNode,*BiTree;

static int pushCount = 0; //用于统计入栈的次数
static int popCount = 0; //用于统计出栈的次数

/*------------------------顺序栈的定义---------------------*/
typedef BiTNode* SElemType;//栈中存储的是结点的指针而非结点本身
typedef struct{
    SElemType *base;//栈底指针
    SElemType *top; //栈顶指针
    int stacksize;  //栈可用的最大容量
}SqStack;

/*栈的实现 */
//下面两个函数由裁判程序实现,无需再写
Status Push(SqStack &S,SElemType e);/*元素e入栈*/
Status Pop(SqStack &S,SElemType &e);/* 删除并仅返回S的栈顶元素 */

//下面三个函数请提供实现代码
Status InitStack(SqStack &S);  /*栈初始化 */
SElemType GetTop(SqStack S);    /* 仅返回S的栈顶元素 */
bool stackEmpty(SqStack S);   /*栈是否为空,为空则返回true,否则返回false*/
/*--------------------------堆栈的定义结束------------------*/

//下面三个函数请提供实现代码
void CreateBiTree(BiTree& BT);//先序遍历的顺序建立二叉链表
void InorderTraverse( BiTree BT );//非递归中序遍历
void PreorderTraverse( BiTree BT );//非递归先序遍历
//下面函数由裁判程序实现,无需提供实现代码
void PostorderTraverse( BiTree BT );//非递归后序遍历
void TestStack();
void CreateBiTree1(BiTree& BT);

裁判测试程序样例:
在这里给出函数被调用进行测试:
int main()
{
    BiTree BT;
    int mode ;
    cin>>mode;
    switch(mode){
        case 0: //测试栈的相关函数定义
            TestStack();break;
        case 1: //测试CreateBiTree()函数
            CreateBiTree(BT);
            cout<<"Postorder:";
            PostorderTraverse(BT);
            cout<<endl;
            break;
        case 2: //测试PreorderTraverse()函数
            CreateBiTree1(BT);
            pushCount = popCount = 0;
            cout<<"Preorder:"; PreorderTraverse(BT); cout<<endl;
            cout<<"pushCount:"<<pushCount<<endl;
            cout<<"popCount:"<<popCount<<endl;
            break;
        default: //测试InorderTraverse()函数
            CreateBiTree1(BT);
            pushCount = popCount = 0;
            cout<<"Inorder:"; InorderTraverse(BT); cout<<endl;
            cout<<"pushCount:"<<pushCount<<endl;
            cout<<"popCount:"<<popCount<<endl;
    }
    return 0;
}
/* 请在这里填写答案 */

输入的第一行为测试模式mode赋值:

当输入的mode为0时,测试堆栈的三个函数InitStack、
GetTop、stackEmpty是否正确;
当输入的mode为1时,接着第二行输入二叉树先序的字符顺序,#表示空树,测试先序顺序建立二叉树的函数CreateBiTree是否正确,由裁判程序对二叉树进行后序遍历来测试。
当输入的mode为2时,接着第二行输入二叉树先序的字符顺序,#表示空树,测试先序遍历的非递归函数,因为非递归算法需要使用栈,因此裁判程序中会输出栈的push和pop次数;
当输入的mode为3时,接着第二行输入二叉树先序的字符顺序,#表示空树,测试中序遍历的非递归函数,因为非递归算法需要使用栈,因此裁判程序中会输出栈的push和pop次数。
输入样例:
在这里给出一组输入:

1
ABC##DE#G##F###

输出样例:
在这里给出相应的输出:

Postorder:CGEFDBA

我的答案如下:


Status InitStack(SqStack &S) {
    S.base = new SElemType[MAXSIZE];
    if (!S.base)
        return (OVERFLOW);
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return OK;
}

SElemType GetTop(SqStack S) {
    return *(S.top - 1);
}

bool stackEmpty(SqStack S) {
    if (S.top == S.base)
        return false;
    return true;
}
void CreateBiTree(BiTree &BT) {
    char ch;
    cin >> ch;
    if (ch != '#')
    {
        BT = new BiTNode;
        BT->Data = ch;
        CreateBiTree(BT->lchild);
        CreateBiTree(BT->lchild);
    }
}

void InorderTraverse( BiTree BT ) {
    //CreateBiTree(BT);
    SqStack S;
    InitStack(S);
    BiTree p = BT;
    //BiTree q = new BiTNode;
    while (p || !stackEmpty(S)) {
        if (p) {
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            cout << p->Data;
            p = p->rchild;
        }
    }
}

void PreorderTraverse( BiTree BT ) {
    //CreateBiTree(BT);
    SqStack S;
    InitStack(S);
    BiTree p = BT;
    //BiTree q = new BiTNode;
    while (p || !stackEmpty(S)) {
        if (p) {
            cout << p->Data;
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            p = p->rchild;
        }
    }
}

img

请问为什么错了啊?

  • 写回答

6条回答 默认 最新

查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 5月21日
  • 已采纳回答 5月13日
  • 创建了问题 5月12日

悬赏问题

  • ¥15 在codeblocks里主函数运行到打印生成的链表就结束了 没有再往下是为什么呢
  • ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
  • ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥30 matlab appdesigner私有函数嵌套整合