我正在实施二叉搜索树,但由于某些原因我无法添加节点
我的:输入是:
a.value = 5;
add_bst_node(&t,a);
mystructures:
typedef struct BST_node{
entity value;
struct BST_node* left;
struct BST_node* right;
}BST_node;
typedef struct BST_tree{
BST_node* root;
}BST_tree;
我添加节点的代码:
void add_bst_node2(BST_node* root,entity* e){
if(!root){
root = (BST_node*)malloc(sizeof(BST_node));
root->value = *e;
root->left = NULL;
root->right = NULL;
return;
}
else if(great_than(&root->value,e))
add_bst_node2(root->left,e);
else
add_bst_node2(root->right,e);
}
void add_bst_node(BST_tree* t,entity e){
add_bst_node2(t->root,&e);
printf("%d\n",t->root==NULL);
}
有人可以解释为什么我不能添加节点?
答案 0 :(得分:1)
除了没有在BST_node
中传递BST_node**
(即add_bst_node2()
)的双指针,如评论中所述,您也没有正确实现该功能。
您的实现从未真正添加节点,而是进入无限递归。
在这里你可以找到一些关于BST的清晰理论 - http://www.zentut.com/c-tutorial/c-binary-search-tree/
这是对您的代码进行的未经测试的更正。 请注意,我们将指针传递给BST_tree
而不是BST_node
void add_bst_node2(BST_tree* tree,entity* e){
if(!tree->root){
/* If the binary search tree is empty, we just create a root node */
tree->root = bst_create_node(e);
return;
}
int is_left = 0;
BST_node* current_node = tree->root;
BST_node* prev = NULL;
/* Traverse the tree until we find the proper position for the new node.
* The position is denoted by 'current_node'
*/
while(current_node != NULL) {
prev = current_node;
if(greater_than(¤t_node->value, e)) {
is_left = 1;
current_node = current_node->left;
} else {
is_left = 0;
current_node = current_node->right;
}
}
/* We finally know the position where we should add the new node */
if(is_left)
prev->left = bst_create_node(e);
else
prev->right = bst_create_node(e);
}
我们介绍了另一个创建和初始化节点的功能......
BST_node *bst_create_node(entity *e)
{
BST_node *n = malloc(sizeof(BST_node));
n->value = *e;
n->left = NULL;
n->right = NULL;
return n;
}
最后我们改变add_bst_node()
void add_bst_node(BST_tree* t,entity e){
add_bst_node2(t, &e);
printf("%d\n", t->root==NULL);
}
答案 1 :(得分:0)
从它看来,a是一个struct BST_node,value是一个变量。您必须将值传递给函数并在那里处理节点创建,或者传递整个构造节点并从现有树中指向它。
答案 2 :(得分:0)
首先是你把一个不必要的结构BST_tree.You以简单的方式做到了
struct node
{
int value;
node* left;
node* right;
};
struct node* root;
我建议您尝试使用此代码
struct node* insert(struct node* r, int data)
{
if(r==NULL) // BST is not created created
{
r = (struct node*) malloc(sizeof(struct node)); // create a new node
r->value = data; // insert data to new node
// make left and right childs empty
r->left = NULL;
r->right = NULL;
}
// if the data is less than node value then we must put this in left sub-tree
else if(data < r->value){
r->left = insert(r->left, data);
}
// else this will be in the right subtree
else {
r->right = insert(r->right, data);
}
return r;
}`
`