恆星 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日

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向