【发布时间】:2019-04-26 08:35:06
【问题描述】:
///// bst.h /////
typedef struct BStree_node {
Key key;
Data data;
struct BStree_node *left, *right;
}
BStree_node;
typedef BStree_node** BStree;
///// bst.c /////
BStree_node *new_node(Key key, Data data) {
BStree_node *node;
node = (BStree_node *) malloc(sizeof(BStree_node));
node->key = key;
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void bs_tree_insert(BStree bst, Key_Type key, Data_Type data) {
bst_insert_helper(*bst, key, data);
}
void bst_insert_helper(BStree_node *node_ptr, Key_Type key, Data_Type data) {
if ( node_ptr == NULL ) {
node_ptr = new_node(key, data);
}
else {
if ( key_comparison(key, node_ptr->key) < 0 )
bst_insert_helper(node_ptr->left, key, data);
else if ( key_comparison(key, node_ptr->key) > 0 )
bst_insert_helper(node_ptr->right, key, data);
else
;
}
}
我很困惑这段代码有什么问题。
原始方法 bs_tree_insert 接受参数 key、data 和 bst(BStree 类型,它是指向 BStree_node 的指针)。所以为了使用递归插入一个新节点,我用 (*bst) 调用了 bst_insert_helper 方法,它是一个指向根节点的指针,对吧?
然后 bst_insert_helper 方法递归地找到插入节点的位置。显然这段代码有错误,但我不确定在哪里。
我在想也许我需要构建一个辅助方法,每次都接受一个新的子树而不是一个节点,但我不明白这与只在它们链接时采用一个节点有什么不同。
【问题讨论】:
-
为什么是
typedef BStree_node** BStree而不是typedef BStree_node* BStree? -
这个:
node_ptr = create_new_node(key, data);- 对调用者意味着 nothing,callers 指针保持不变,因为它是按值传递的,并且您会泄漏内存作为伤口中添加的盐剂量。另外,发布真实代码。这篇文章中没有bst_insert,但你是从bs_tree_insert调用它 -
@WhozCraig 道歉,我的意思是从树插入方法中调用辅助方法
标签: c search tree insert binary