C++ 二叉搜索树插入实现
C++ Binary Search Tree Insert Implementation
我正在尝试构建一个函数以插入到二叉搜索树中,但我很难弄清楚为什么它不起作用。我从根本上理解该函数应该如何工作,但是根据给我的模板,我似乎要避免创建 BST class 而是依赖节点 class 并构建所需的功能来解决这个问题。这是给定的模板:
#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,它 returns NULL。知道我在这里缺少什么吗?为什么不用等于 insert_node 的新节点替换 root?
我也意识到这似乎不是实现 BST 的最佳方式,但我正在尝试使用提供给我的模板。如有任何建议,我们将不胜感激。
正如 Joachim 所说,您的问题与按引用传递参数和按值传递参数之间的区别有关。
在您的代码 void insert(Node *insert_node, Node *tree_root)
中,您按值传递 Node* tree_root
。在函数内部您更改此指针的本地副本,因此外部值不会更改。
要修复它,您应该将 Node* tree_root
传递给 reference。参数声明可以是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());
我正在尝试构建一个函数以插入到二叉搜索树中,但我很难弄清楚为什么它不起作用。我从根本上理解该函数应该如何工作,但是根据给我的模板,我似乎要避免创建 BST class 而是依赖节点 class 并构建所需的功能来解决这个问题。这是给定的模板:
#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,它 returns NULL。知道我在这里缺少什么吗?为什么不用等于 insert_node 的新节点替换 root?
我也意识到这似乎不是实现 BST 的最佳方式,但我正在尝试使用提供给我的模板。如有任何建议,我们将不胜感激。
正如 Joachim 所说,您的问题与按引用传递参数和按值传递参数之间的区别有关。
在您的代码 void insert(Node *insert_node, Node *tree_root)
中,您按值传递 Node* tree_root
。在函数内部您更改此指针的本地副本,因此外部值不会更改。
要修复它,您应该将 Node* tree_root
传递给 reference。参数声明可以是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());