簡體   English   中英

二進制搜索樹:插入函數中的指針丟失

[英]Binary Search Tree: lost pointer in insertion function

用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為null,所以它在if語句內退出),但是當我嘗試插入第二個並離開此功能時,樹只有第一個節點。

讓我知道是否忘記提供任何相關信息。

問題在這里:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM