以下二进制搜索树插入方法有什么问题?

时间:2018-11-23 18:44:14

标签: c search tree insert binary

///// 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方法以递归方式找到一个插入节点的位置。显然此代码有错误,但我不确定在哪里。

我在想也许我需要建立一个每次使用新的子树而不是节点的辅助方法,但我不知道这与仅将一个节点链接在一起会有什么不同。 / p>

2 个答案:

答案 0 :(得分:1)

您不需要构建帮助器。实际上,您需要丢失一个。您的输入函数需要一个(R|E)FLAGS(不方便地隐藏在类型别名中),而这正是您需要对调用者指针进行修改(按地址原样传递)插入的内容。

BStree_node**

您将指针类型隐藏在别名中的事实使此困难变得不容易理解。我强烈建议不要这样做。 C程序员希望看到星号,这是指针操作的名片。

答案 1 :(得分:0)

您也忘记添加等式 请同时添加以创建社交方式