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条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥60 求一个简单的网页(标签-安全|关键词-上传)
    • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
    • ¥15 基于卷积神经网络的声纹识别
    • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
    • ¥100 为什么这个恒流源电路不能恒流?
    • ¥15 有偿求跨组件数据流路径图
    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
    • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
    • ¥15 CSAPPattacklab
    • ¥15 一直显示正在等待HID—ISP