我已经提出了一个基本的二进制搜索树。这是我的节点
#ifndef NODE_H
#define NODE_H
template<typename T> class node{
template<typename E> friend class bst;
public:
node():data(0), left(NULL), right(NULL){}
node(T data):data(data),left(NULL), right(NULL){}
private:
T data;
node<T>* left;
node<T>* right;
};
#endif
这是我的兄弟。
#ifndef BST_H
#define BST_H
template<typename T> class bst{
public:
bst():root(NULL), nodes(0){}
bst(node<T>* root):root(root), nodes(0){}
void insert(node<T>* root, const T& data){
if(root == NULL){
node<T>* root = new node<T>();
root->data = data;
nodes++;
return;
}else if(data <= root->data) {
insert(root->left, data);
}else if(data >= root->data){
insert(root->right, data);
}
}
void preorder(node<T>* root){
if(root == NULL) return;
std::cout<< root->data<<'\n';
preorder(root->left);
preorder(root->right);
}
private:
node<T>* root;
int nodes;
};
#endif
这是调用函数
int main(){
node<int>* root = new node<int>(17);
bst<int>* t = new bst<int>(root);
t->insert(root,21);
t->insert(root,12);
t->insert(root, 9);
t->preorder(root);
delete t;
}
输出只是17,这是根。我觉得我的插入方法无法正常工作,因为预订是一个非常标准的实现。有人可以帮我解决这里出了什么问题。
答案 0 :(得分:2)
在插入内部不创建局部变量,只需使用一个passe。而不是
node<T>* root = new node<T>();
只做
root = new node<T>();
并通过引用传递root。我会用typedef
来做typedef node<T>* nodePtr;
void insert(nodePtr &root, const T& data){
但你也可以在没有
的情况下完成答案 1 :(得分:1)
你必须通过引用传递root,并且不要创建一个遮蔽它的局部变量:
// ...
void insert(node<T>*& root, const T& data){ // passed by reference
if(root == NULL){
root = new node<T>(); // reference overwritten
//...
这给了我
17
12
9
21
作为输出,正如预期的那样我猜。
答案 2 :(得分:1)
我看到两个问题。
首先,您要将root
声明为insert()
方法中的局部变量。此名称与数据成员根重叠。
第二个是,正如您设计的那样,根不会更新。
此代码应该有效:
void insert(node<T>*& root, // <-- root as reference for updating
const T& data){
if(root == NULL){
root = new node<T>(); // <-- here you update root
root->data = data;
nodes++;
return;
}else if(data <= root->data) {
insert(root->left, data);
}else if(data >= root->data){
insert(root->right, data);
}
}
当然,您可以重构,从而获得更简洁和优雅的实现。但这应该产生你期望的结果