简体   繁体   English

二进制搜索树代码用于插入操作的问题

[英]Problem with Binary Search tree code for insert operation

I am unable to access the left,right nodes from my root node in my insert function as evidenced by the terminal output. 如终端输出所示,我无法从插入函数中的根节点访问左右节点。 What is causing the error. 是什么导致错误。

Code Body: 代码体:

#include<iostream>

class Node {
    public:
    int key; int data;
    Node * left;
    Node* right;
    Node (int key, int data):key(key),data(data),right(nullptr),left(nullptr){std::cout<<"ooga booga"<<std::endl;}

    //Recursive function to insert an key into BST
    void insert( int key,int data)
    {
        std::cout<<"reached here.Current node now has key="<<this->key<<" while input key is "<<key <<std::endl;
        // if the root is null, create a new node an return it
        if (this == nullptr)
        {
            std::cout<<"in 1st if block "<<this->key<<std::endl;    
            this->key=key;
            this->data=data;
            return;
        }

        // if given key is less than the root node, recur for left subtree
        if (key < this->key)
        {   
            std::cout<<"in 2nd if block "<<this->key<<std::endl;    
            left->insert(key, data);
            std::cout<<"in else block 2"<<this->key<<std::endl;
        }

        // if given key is more than the root node, recur for right subtree
        else
        {
            std::cout<<"in else block "<<this->key<<std::endl;  
            right->insert(key, data);}
            std::cout<<"in else block 2"<<this->key<<std::endl; 
            return;
        }

// A utility function to do inorder traversal of BST 
void inorder() 
{ 
    if (this != nullptr) 
    { 
        this->left->inorder(); 
        printf("%d \n", this->key); 
        this->right->inorder(); 
    } 
} 



};


// Driver Program to test above functions 
int main() 
{ 
    /* Let us create following BST 
              50 
           /     \ 
          30      70 
         /  \    /  \ 
       20   40  60   80 */
    Node *root=new Node(50,10); 
    std::cout<<root<<std::endl;
    std::cout<<root->left<<std::endl;
    //root=nullptr;
    std::cout<<"reached here"<<std::endl;
    std::cout<<"reached here.Root now has key="<<root->key<<std::endl;
    root->insert( 0,10); 
    root->insert( 20,10); 
    root->insert( 40,10); 
    root->insert( 70,10); 
    root->insert(  60,10); 
    root->insert( 80,10); 
    std::cout<<"reached here 2"<<std::endl;
    // print inoder traversal of the BST 
    root->inorder(); 

    return 0; 
} 

Output: 输出:

ooga booga
0x7fffc10c6e70
0
reached here
reached here.Root now has key=50
reached here.Current node now has key=50 while input key is 0
in 2nd if block 50
Segmentation fault (core dumped)

General summary: 概述:

You are creating Node objects with left=nullptr and right=nullptr . 您正在使用left=nullptrright=nullptr创建Node对象。

You are never actually initializing these left and right pointers to a new Node . 您从来没有真正初始化这些leftright指针到一个new Node

Before trying to access left->insert , you must first create a new Node . 在尝试访问left->insert ,必须首先创建一个new Node

So this is the only change made to the insert function based on MPops reply which now works: 因此,这是基于MPops答复的对插入函数所做的唯一更改,该更改现已生效:

void insert( int key,int data)
{
    if (key < this->key) {
        if(this->left ==nullptr)
            { left=new Node(key,data); return;}
        else 
            left->insert(key,data);
    }

    else {
        if(this->right ==nullptr)
            { right=new Node(key,data); return;}
        else 
            right->insert(key,data);
    }


}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM