【问题标题】:C++ Binary Search Tree Insert ImplementationC++ 二叉搜索树插入实现
【发布时间】:2016-09-09 18:48:05
【问题描述】:

我正在尝试构建一个插入二叉搜索树的函数,但我很难弄清楚为什么它不起作用。我从根本上理解该函数应该如何工作,但根据给我的模板,我似乎要避免创建 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。知道我在这里缺少什么吗?为什么不将root替换为与insert_node相等的新节点?

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

【问题讨论】:

  • 搜索并阅读在 c++ 中通过引用传递参数。
  • void insert(Node *insert_node, Node*&amp; tree_root).
  • 更好void insert(std::unique_ptr&lt;Node&gt; insert_node, std::unique_ptr&lt;Node&gt;&amp; tree_root)。
  • @Jarod42,感谢您的意见!是什么让第二个版本变得更好?
  • 智能指针允许不手动处理内存。因此,在您使用std::unique_ptr 的示例中,您不会有内存泄漏。

标签: c++ binary-tree


【解决方案1】:

正如 Joachim 所说,您的问题与通过引用传递参数和通过值传递参数之间的区别有关。

在您的代码void insert(Node *insert_node, Node *tree_root) 中,您通过值传递Node* tree_root。在函数内部你改变了这个指针的本地副本,所以外部值不会改变。

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

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

【讨论】:

  • 非常感谢,这是一个很好的解释。我仍在努力寻找最合适的时间来传递参数以供参考,当然还有更多的阅读要做,但这种解释很有帮助。
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多