恆星 2023-04-24 23:21 采纳率: 0%
浏览 27

非递归中序遍历二叉树出现异常

最近在学数据结构,在看到非递归中序遍历二叉树时,感觉是push()和pop()有点问题

输入数据:C D N K # # J # # B Z # # # F L # # M # #
树的图:

img

一开始对CDNK分别进栈没有问题,出栈时出现问题
第一次top--时能准确定位到K这个节点

img

第二次top--就出现错误了,本来应该是N

img

最后引发如下异常

img

输出为

img

以下是我的全部代码

#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXLEN 100

typedef string TElemType;
typedef struct BiNode {                    //二叉树
    TElemType data;
    BiNode* lChild;
    BiNode* rChild;
}BiNode, * BiTree;

struct SqStack {                        //栈
    BiNode* base;
    BiNode* top;
    int stackSize;
};

void visit(const BiTree& t) {
    cout << t->data << " ";
}

int InitStack(SqStack& s) {                //栈的初始化
    s.base = new BiNode[MAXLEN];
    if (!s.base)
        exit(OVERFLOW);
    s.top = s.base;
    s.stackSize = MAXLEN;
}
int EmptyStack(const SqStack& s) {            //判断是否为空
    if (s.base == s.top) {
        return OK;
    }
    else
    {
        return FALSE;
    }
}
int Push(SqStack& s, BiTree e) {        //入栈(和chapter06的不一样)
    if (s.top - s.base == s.stackSize)
        return ERROR;
    s.top = e;
    s.top++;
    return OK;
}
int Pop(SqStack& s, BiTree& e) {                //出栈(和chapter06的不一样)
    if (EmptyStack(s))
        return ERROR;
    s.top--;
    e = s.top;
    return OK;
}
int inOrder_unrec(const BiTree& t) {        //中序遍历-非递归
    SqStack S;
    InitStack(S);
    BiTree p = NULL;
    BiTree q = NULL;
    p = t;
    cout << "o"<<endl;;
    while (p || !EmptyStack(S)) {
        if (p) {
            Push(S, p);
            p = p->lChild;
            cout << "oo" << endl;
        }
        else {
            Pop(S, q);
            cout << q->data;
            p = q->rChild;
            cout << "ooo" << endl;;

        }
    }
    return OK;
}

int CreateBiTree(BiTree& t) {                //前序遍历创建二叉树
    char ch;
    cin >> ch;
    if (ch == '#')
        t = NULL;
    else {
        if (!(t = new BiNode))
            exit(OVERFLOW);
        t->data = ch;
        CreateBiTree(t->lChild);
        CreateBiTree(t->rChild);
    }
    return OK;
}

int main() {
    inOrder_unrec(t);
    CreateBiTree(t);
    system("pause");
    return 0;
}



  • 写回答

3条回答 默认 最新

  • threenewbee 2023-04-24 23:29
    关注

    t->data = ch;
    在这里后面加上一个
    t->lchild = t->rchild = NULL;
    看看

    评论

报告相同问题?

问题事件

  • 修改了问题 4月24日
  • 创建了问题 4月24日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境