【问题标题】:What is wrong with the following binary search tree insert method?下面的二叉搜索树插入方法有什么问题?
【发布时间】: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); - 对调用者意味着 nothingcallers 指针保持不变,因为它是按值传递的,并且您会泄漏内存作为伤口中添加的盐剂量。另外,发布真实代码。这篇文章中没有bst_insert,但你是从bs_tree_insert调用它
  • @WhozCraig 道歉,我的意思是从树插入方法中调用辅助方法

标签: c search tree insert binary


【解决方案1】:

您不需要构建助手。事实上,你需要一个。您的入口函数采用BStree_node**(不方便地隐藏在类型别名中),而这正是您需要通过修改调用者指针插入的内容,按地址传递,完好无损。

void bs_tree_insert(BStree bst, Key_Type key, Data_Type data) 
{
    if (*bst == NULL)
    {
        *bst = create_new_node(key, data);
    }
    else
    {
        int cmp = key_comparison(key, (*bst)->key);
        if (cmp < 0)
            bst_tree_insert(&(*bst)->left, key, data);
        else if (0 < cmp)
            bst_tree_insert(&(*bst)->right, key, data);
        // else equivalent; no duplicates
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多