【问题标题】:problems with SIGSEGV when working on binary search tree处理二叉搜索树时 SIGSEGV 的问题
【发布时间】:2021-04-10 07:58:32
【问题描述】:

我正在研究二叉搜索树,我希望在节点的左侧放置较小的数字,在节点的右侧放置更大的数字,并输出完整的遍历。但是,我遇到了 SIGSEGV使用指针时。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

struct node{
    node* left;
    node* right;
    int key;
};

node* root;
void createnode(int data,node* ptr);
void traversal(node* ptr);

int main(void)
{
srand(time(NULL));
int j;
root = NULL;

for(j=1;j<=16;j++){
    createnode(rand(),root);
}
root=NULL;
traversal(root);

   return 0;
}

void createnode(int data,node* ptr){
    if(ptr==NULL){
        ptr->left=new node;
        ptr->right=new node;
        ptr->key=data;
        ptr->left=NULL;
        ptr->right=NULL;
    }
    else if(data<ptr->key){
        createnode(data,ptr->left);
    }
    else if(data>ptr->key){
        createnode(data,ptr->right);
    }
    else{
        cout<<"error";
    }
}

void traversal(node* ptr){
    if(ptr->left==NULL&&ptr->right==NULL){
        cout<<ptr->key;
    }
    else if(ptr->left!=NULL){
        traversal(ptr->left);
        cout<<ptr->key;
    }
    else if(ptr->right!=NULL){
        traversal(ptr->right);
        cout<<ptr->key;
    }
}

另外,我不确定是否声明节点*左,节点*右,如果是,我应该在哪里声明。谢谢。

【问题讨论】:

  • if(ptr==nullptr) { ptr-&gt;...; -- 你不能取消引用 nullptr
  • @PaulMcKenzie 我已经用 NULL 替换了所有 nullptr,我还能做什么,tks
  • @930727fre 使用NULL 而不是nullptr 不会改变任何东西。无论使用什么空指针常量使其为空,都不能取消引用空指针。您的 root 指针没有指向任何东西,因此任何使用它所指向的东西的尝试都是无效的。
  • SEGV 为您提供一个核心文件和/或在它发生的地方停止调试器。您是否尝试过使用调试器检查核心文件,或者在调试器中运行时重现错误?您有很多尚未查看的可用信息。

标签: c++ pointers binary-tree


【解决方案1】:

您需要详细说明(也许对自己)您希望这样做:

root=nullptr;
traversal(root);

一旦你进入:

void traversal(node* ptr)
{
    if(ptr->left==nullptr // <-- this checks the ->left of nullptr

你会遇到崩溃,因为nullptr 没有左边。你期望遍历做什么?在调用遍历之前,您可能打算将 root 指向某个东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多