【问题标题】:Binary Search Tree: lost pointer in insertion function二叉搜索树:插入函数中的指针丢失
【发布时间】:2012-03-16 22:47:53
【问题描述】:

用 BST 做一个项目,我的插入函数的某个地方出现了逻辑错误,只是似乎找不到它。

插入函数:

int bst_insert (bst_t *tree, bst_key_t key)
{
  bst_node_t *node, *temp_node;
  if( tree == NULL ) {
    printf("Invalid tree pointer.\n");
    return;
  }
  if( tree->root == NULL ) {
    node = (bst_node_t *)malloc(sizeof(bst_node_t));
    node->left = node->right = NULL;
    node->key = key;
    tree->root = node;
    return 1;
  }
  temp_node = tree->root;
  while(1) {
    if( temp_node == NULL ) {
      node = (bst_node_t *)malloc(sizeof(bst_node_t));
      node->left = node->right = NULL;
      node->key = key;
      temp_node = node;
      return 1;
    }
    if( temp_node->key == key ) {
      temp_node->data_ptr = data;
      return 0;
    } else if( key < temp_node->key ) {
      temp_node = temp_node->left;
    } else if( temp_node->key < key ) {
      temp_node = temp_node->right;
    }
  }  
}

在使用这个函数时,插入一个节点就可以了(可能是因为 tree->root 为空,所以它在 if 语句中退出),但是当我尝试插入第二个节点并离开这个函数时,只有树其中有第一个节点。

如果我忘记提供任何相关信息,请告诉我。

【问题讨论】:

  • 投票结束:让陌生人通过检查发现代码中的错误是没有效率的。您应该使用调试器或打印语句来识别(或至少隔离)问题,然后返回更具体的问题。
  • 我的错,我看看能不能缩小范围。

标签: c pointers tree binary-tree binary-search-tree


【解决方案1】:

问题出在这里:

temp_node = tree->root;
...
temp_node = node;

您假设当您执行第二次分配时,它实际上会影响 temp_node 指向的节点。但实际上,它只是简单地替换了temp_node 的内容而不改变其他任何东西(它是一个局部变量)。

一种解决方案是有一个指向“节点指针”的指针。然后,当你改变这个指针指向的值时,你实际上是在“改变世界”而不是改变一个局部变量。比如:

bst_node_t **temp_node;
...
temp_node = &tree->root;

/* To change the value that temp_node is pointing to */
*temp_node = node;

/* To change temp_node itself */
...
} else if( key < temp_node->key ) {
  temp_node = &temp_node->left;
} else if( temp_node->key < key ) {
  temp_node = &temp_node->right;
}

可以在不使用指针的情况下解决此问题,但是您必须继续记住前一个(父)指针,以及是否需要更改 leftright

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多