繁体   English   中英

C ++二进制搜索树插入实现

[英]C++ Binary Search Tree Insert Implementation

我正在尝试构建要插入到二进制搜索树中的函数,但是我很难弄清楚为什么它不起作用。 我从根本上理解了该函数应该如何工作,但是基于模板,我似乎避免创建BST类,而是依靠Node类并构建所需的函数来工作。 这是给定的模板:

#include <iostream>
#include <cstddef>

using std::cout;
using std::endl;

class Node {
    int value;
public:
    Node* left;       // left child
    Node* right;      // right child
    Node* p;          // parent
    Node(int data) {
        value = data;
        left = NULL;
        right = NULL;
        p  = NULL;
    }
    ~Node() {
    }
    int d() {
        return value;
    }
    void print() {
        std::cout << value << std::endl;
    }
};

function insert(Node *insert_node, Node *tree_root){
    //Your code here
}

我遇到的问题是当我实现以下代码时,其中getValue是Node的简单getter方法:

int main(int argc, const char * argv[]) {
     Node* root = NULL;
     Node* a = new Node(2);
     insert(a, root);
}

void insert(Node *insert_node, Node *tree_root){
    if (tree_root == NULL)      
        tree_root = new Node(insert_node->getValue());

该代码似乎可以编译并没有错误地运行,但是如果我在此之后在root上运行另一个检查,它将返回NULL。 知道我在这里缺少什么吗? 为什么不用与insert_node相等的新节点替换root?

我也意识到这似乎不是实现BST的最佳方法,但是我正在尝试使用提供给我的模板。 任何意见,将不胜感激。

正如Joachim所说,您的问题与按引用传递值和按值传递参数之间的差异有关。

在代码void insert(Node *insert_node, Node *tree_root) ,按值传递Node* tree_root 在函数内部,您可以更改此指针的本地副本,因此外部值不会更改。

要修复它,您应该通过reference传递Node* tree_root 参数声明可以是Node*& tree_root (或Node** tree_root )。 例如:

void insert(Node* insert_node, Node*& tree_root){
    if (tree_root == NULL)      
        tree_root = new Node(insert_node->getValue());

暂无
暂无

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

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