无法使用非递归顺序方法遍历二叉树

Cannot traverse a binary tree with non-recursive inorder method

本文关键字:顺序 方法 遍历 二叉树 递归      更新时间:2023-10-16

我正试图遍历一个用键盘输入数据构建的二进制树。数据已成功插入到二进制树中。我有一个switch语句,其中"case 3"应该使用非递归Inorder遍历算法遍历(并打印)二进制树。然而,当调用"case 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;

这些是推送和弹出功能,

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.nn");
        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;

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

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

CCD_ 1不改变CCD_ 2,因为它是通过值传递的。

然后在这里:

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

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