请参阅下面的BST代码。它只输出“5”。我做错了什么?
#include <iostream>
class bst {
public:
bst(const int& numb) : root(new node(numb)) {}
void insert(const int& numb) {
root->insert(new node(numb), root);
}
void inorder() {
root->inorder(root);
}
private:
class node {
public:
node(const int& numb) : left(NULL), right(NULL) {
value = numb;
}
void insert(node* insertion, node* position) {
if (position == NULL) position = insertion;
else if (insertion->value > position->value)
insert(insertion, position->right);
else if (insertion->value < position->value)
insert(insertion, position->left);
}
void inorder(node* tree) {
if (tree == NULL)
return;
inorder(tree->left);
std::cout << tree->value << std::endl;
inorder(tree->right);
}
private:
node* left;
node* right;
int value;
};
node* root;
};
int main() {
bst tree(5);
tree.insert(4);
tree.insert(2);
tree.insert(10);
tree.insert(14);
tree.inorder();
return 0;
}
答案 0 :(得分:1)
使用参考:
void insert(node * insertion,node *&amp; position)
void inorder(node *&amp; tree){
答案 1 :(得分:1)
这是因为您从未设置left
的{{1}}和right
字段的值。
对于给定节点,您必须说,root
:
n
你从未这样做过。所以你最终得到了一个节点树。你的root有两个空子。
你也可以偷偷摸摸地说:如果你做的是@ user1431015建议,并通过引用传递子指针,那么对参考paraemter(n->left = ...
n->right = ...
)的赋值就可以了。正如您所做的那样,按值传递它们只会分配给局部变量,而不是树本身。
答案 2 :(得分:1)
在大多数情况下,您的插入内容永远不会结束。递归的基本情况是:
void insert(node* insertion, node* position) {
if (position == NULL) position = insertion;
但所有&#39;的位置&#39; is是一个本地范围的指针值。一旦你的功能退出,分配给它将无效。
您需要做的是将位置参数作为引用指向指针。换句话说,使其成为node*&
类型。退出函数后,分配将停止。