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