【问题标题】:Cannot traverse a binary tree with non-recursive inorder method无法使用非递归中序方法遍历二叉树
【发布时间】:2016-01-11 13:27:08
【问题描述】:

我正在尝试遍历使用键盘输入数据构建的二叉树。数据成功插入二叉树。我有一个 switch 语句,其中“案例 3”应该使用非递归中序遍历算法遍历(并打印)二叉树。但是,当调用“案例 3”时,它会给出 EXC_BAD_ACCESS 错误,这对我来说毫无意义。如果有人帮我解决这个问题,我会非常高兴。

(RootPtr 是全局定义的二叉树的顶层 0- 节点;GetNodeS 基本上是用于 StackPtr 类型指针的初始化函数(使用 malloc)。)

提前谢谢大家。

以下是相关代码:

这些是结构定义,

Typedef struct treeItem
{
    int data;
    struct treeItem *left;
    struct treeItem *right;

}Tree , *TreePtr;

typedef struct stackItem
{
    TreePtr t;
    struct stackItem *next;

}Stack , *StackPtr;

这些是 Push 和 Pop 函数,

void PushS (TreePtr TreePointer)
{
    StackPtr TemPtr;
    GetNodeS(&TemPtr);

    (*TemPtr).t = TreePointer;
    (*TemPtr).next = S;
    S = TemPtr;
}

void PopS(TreePtr TreePointer)
{
    StackPtr TemPtr;
    GetNodeS(&TemPtr);

    if (S != NULL)
    {
        TreePointer = (*S).t;
        TemPtr = S;
        S = (*S).next;

        FreeNodeS(TemPtr);
    }    
    else
        printf("\nEmpty stack!");

}

这是遍历函数,

void iterative (TreePtr TemPtr)
{
    DONE = 0;
    TemPtr = RootPtr;
    S = NULL;

    if(items==0)
    {
        printf("\nTree is empty.\n\n");
        DONE = 1;
    }
    else
    {
        printf("\nIterative nonrecursive inorder traversal:");

        while (DONE == 0)
        {
            if(TemPtr != NULL)
            {
                PushS(TemPtr);
                TemPtr = (*TemPtr).left;
            }
            else
                if(S != NULL)
                {
                    PopS(TemPtr);
                    printf(" %d", (*TemPtr).data); //the line I get the ERROR
                    TemPtr = (*TemPtr).right;
                }
                else
                {
                    DONE = 1;
                }
        }
    }
}

这是我尝试调用迭代遍历函数的开关情况,

     case 3:
            TreePtr TemPtr;
            GetNode(&TemPtr);

            iterative(TemPtr);

            break;

【问题讨论】:

  • 请在您的问题中发布minimal reproducible example
  • 为了完整和最小化,我必须将我的代码分成块并只提供与错误相关的代码。实际代码大约 400 行,我认为这与我发布的代码相差甚远。
  • 你为什么忽略iterative的参数?
  • 您发布了 您认为 与错误相关的内容。无论如何,看起来我们无法从这些方面真正诊断出您的问题。例如,那个神秘的GetNode() 是什么?
  • 您似乎认为PopS 修改了它的参数;它没有。 PopS 创建一个新的堆栈节点看起来也很奇怪。我怀疑您在将堆栈实现用于遍历之前没有非常彻底地测试它。

标签: c++ iteration binary-tree inorder non-recursive


【解决方案1】:

您正在取消引用出现错误的行上的空指针。这就是 EXC_BAD_ACCESS 错误的原因。

if(TemPtr != NULL)
{
    ...
}
else // TemPtr must be NULL here

PopS(TemPtr); 不会更改 TempPtr,因为它是按值传递的。

那么这里:

printf(" %d", (*TemPtr).data);

*TemPtr 是一个空指针解引用。

【讨论】:

  • 那么如果我把PopS()函数改成按引用传递,那么应该没问题吧?
猜你喜欢
  • 2021-07-26
  • 2021-01-12
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 2021-06-10
  • 2016-05-01
  • 2019-08-23
相关资源
最近更新 更多