遍历二叉搜索树
Traversing a binary search tree
我实现了一个基本的二叉搜索树。这是我的节点
#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,也就是根。我觉得不知何故我的插入方法没有正常工作,因为预购是一个非常标准的实现。有人可以帮我看看这里出了什么问题吗?
insert里面不创建局部变量,只用one passe。所以而不是
node<T>* root = new node<T>();
只做
root = new node<T>();
并通过引用传递 root。我会用 typedef
typedef node<T>* nodePtr;
void insert(nodePtr &root, const T& data){
但你也可以不用
您必须通过引用传递根,并且不要创建隐藏它的局部变量:
// ...
void insert(node<T>*& root, const T& data){ // passed by reference
if(root == NULL){
root = new node<T>(); // reference overwritten
//...
这给了我
17
12
9
21
作为输出,我猜是预购的预期。
我看到两个问题。
首先是您在 insert()
方法中将 root
声明为局部变量。此名称与数据成员根重叠。
其二,按照你的设计,根没有更新
此代码应该有效:
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);
}
}
当然,你可以重构,从而得到更简洁优雅的实现。但这应该会产生您期望的结果
我实现了一个基本的二叉搜索树。这是我的节点
#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,也就是根。我觉得不知何故我的插入方法没有正常工作,因为预购是一个非常标准的实现。有人可以帮我看看这里出了什么问题吗?
insert里面不创建局部变量,只用one passe。所以而不是
node<T>* root = new node<T>();
只做
root = new node<T>();
并通过引用传递 root。我会用 typedef
typedef node<T>* nodePtr;
void insert(nodePtr &root, const T& data){
但你也可以不用
您必须通过引用传递根,并且不要创建隐藏它的局部变量:
// ...
void insert(node<T>*& root, const T& data){ // passed by reference
if(root == NULL){
root = new node<T>(); // reference overwritten
//...
这给了我
17
12
9
21
作为输出,我猜是预购的预期。
我看到两个问题。
首先是您在 insert()
方法中将 root
声明为局部变量。此名称与数据成员根重叠。
其二,按照你的设计,根没有更新
此代码应该有效:
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);
}
}
当然,你可以重构,从而得到更简洁优雅的实现。但这应该会产生您期望的结果