dream_135 2020-02-23 21:58 采纳率: 0%
浏览 337

搜索二叉树的非递归中序遍历(使用栈),遇到错误:Segmentation fault: 11(mac系统,gcc编译)

typedef int TreeEle;    // 树节点的数据域的类型
typedef struct TreeNode *PtrTNode;    

typedef PtrTNode StackEle;    // 栈的节点的数据域的类型
typedef struct StackNode *PtrSNode;

typedef struct TreeNode
{
    TreeEle ele;
    PtrTNode left;
    PtrTNode right;
}TreeNode;

typedef struct StackNode
{
    StackEle ele;
    PtrSNode next;
}StackNode;


PtrTNode CreateBinTree();    // 创建空二叉树
bool IsTreeEmpty(PtrTNode Root);    // 判断树是否空
PtrTNode InsertTree(PtrTNode Root, TreeEle data);    // 向二叉搜索树里添加一个数据(先递归查找,再添加)
PtrTNode DeleteTree(PtrTNode Root, TreeEle data);    // 从二叉搜索树中删除一个数据(也是先递归查找)
void InOrderTraversal(PtrTNode Root);    // 中序遍历
void PreOrderTraversal_stack(PtrTNode Root);    // 不使用递归的中序遍历(该函数有问题)

PtrSNode CreateStack();    // 创建空栈
bool IsStackEmpty(PtrSNode top);    // 判断栈是否为空
void Push(PtrSNode top, StackEle data);    // 入栈
StackEle Pop(PtrSNode top);    // 出栈


//-------------Tree-----------------
PtrTNode CreateBinTree()
{
    PtrTNode R = (PtrTNode)malloc(sizeof(TreeNode));
    if (NULL != R)
    {
        R->ele = 100;
        R->left = R->right = NULL;    
    }
    return R;
}



PtrTNode InsertTree(PtrTNode Root, TreeEle data)
{
    if (NULL == Root)    // 若原树为空,生成并返回一个节点的二叉搜索树
    {
        Root = (PtrTNode)malloc(sizeof(TreeNode));
        Root->ele = data;
        Root->left = Root->right = NULL;
    }
    else if (data < Root->ele)    
    {
        Root->left = InsertTree(Root->left, data);    // 递归插入左子树
    }
    else if (data > Root->ele)
    {
        Root->right = InsertTree(Root->right, data);    // 递归插入右子树
    }

    return Root;
}



void InOrderTraversal(PtrTNode Root)
{
    if (NULL != Root)
    {
        PreOrderTraversal(Root->left);
        printf("%d  ", Root->ele);
        PreOrderTraversal(Root->right);
    }
}



// 有问题,估计是栈的问题,不是树的问题
void PreOrderTraversal_stack(PtrTNode Root)
{
    PtrSNode S = CreateStack();
    PtrTNode T = Root;
    while ((NULL != T) || (false == IsStackEmpty(S)))    // 只要栈里还有结点未被弹出,就循环
    {
        while (NULL != T)    // 一路向左,并将沿途节点压入栈中
        {
            Push(S, T->left);
            T = T->left;
        }
        if (false == IsStackEmpty(S))
        {
            T = Pop(S);
            printf("%d  ", T->ele);
            T = T->right;
        }
    }
}



bool IsTreeEmpty(PtrTNode Root)
{
    return ((NULL == Root->left) && (NULL == Root->right));
}
//------------------------------------------


//---------------Stack-----------------------
PtrSNode CreateStack()
{
    PtrSNode S;
    S = (PtrSNode)malloc(sizeof(StackNode));
    return S;
}



bool IsStackEmpty(PtrSNode top)
{
    return (NULL == top->next);
}



void Push(PtrSNode top, StackEle data)
{
    PtrSNode S = (PtrSNode)malloc(sizeof(StackNode));
    S->ele = data;
    S->next = top->next;
    top->next = S;
}



StackEle Pop(PtrSNode top)
{
    if ((NULL == top) || (NULL == top->next))
    {
        printf("error!\n");
        return NULL;
    }
    StackEle data = top->next->ele;
    PtrSNode S = top->next;
    top->next = top->next->next;
//    free(S);
    return data;
}
//---------------------------------



int main()
{
    PtrTNode Root = CreateBinTree();
    Root = InsertTree(Root, 25);
    Root = InsertTree(Root, 40);
    Root = InsertTree(Root, 112);
    Root = InsertTree(Root, 312);
    Root = InsertTree(Root, 12);
    Root = InsertTree(Root, 172);
    InOrderTraversal(Root);              // 使用递归的中序遍历没有问题
    printf("\n");
    PreOrderTraversal_stack(Root);      // 使用非递归的中序遍历有问题
    printf("\n");

    return 0;
}

输出为:
25 12 40 100 112 312 172

Segmentation fault: 11

应该不是遍历函数的问题(),遍历函数的逻辑是没有错的
个人认为是栈的写法有问题,网上搜索说该错误是由于使用了野指针或空指针,但是我看了几遍也没有看出问题,特来求助广大网友,望解答

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
    • ¥15 如何在scanpy上做差异基因和通路富集?
    • ¥20 关于#硬件工程#的问题,请各位专家解答!
    • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
    • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
    • ¥30 截图中的mathematics程序转换成matlab
    • ¥15 动力学代码报错,维度不匹配
    • ¥15 Power query添加列问题
    • ¥50 Kubernetes&Fission&Eleasticsearch
    • ¥15 報錯:Person is not mapped,如何解決?