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

时间:2016-09-09 18:48:06

标签: c++ binary-tree

我正在尝试构建一个插入二叉搜索树的函数,但是我很难弄清楚它为什么不起作用。我从根本上理解该函数应该如何工作,但基于我给出的模板,似乎我要避免创建一个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的最佳方式,但我正在尝试使用给我的模板。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

正如Joachim所说,你的问题涉及通过引用传递参数和通过值之间的差异。

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

要解决此问题,您应该通过reference传递Node* tree_root。参数声明可以是Node*& tree_root(或Node** tree_root)。 E.g:

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