2012-12-11 176 views
0

我想完成刪除功能。樹刪除節點

這裏是僞代碼,注意結尾:

我不知道的僞代碼是錯誤的,但。

這裏是我的解讀是:

Node* minNode = Minimum(toDelete->right); 

      int tmp = 0; 
      tmp = minNode->val; 
      // delete(&tmp); 
      free(minNode); 
      minNode=NULL; 
      toDelete->val=tmp; 

除了一旦刪除它,它開始打印時填寫一萬億零。

我在做什麼是有道理的? 我擁有的其他代碼是正確的,或者我認爲無論如何。它只是在這種情況下搞砸了。

這裏的最低功能以及

Node* BST::Minimum(Node *curr) { 

    // if (curr->left != NULL) { 
    //  return(Minimum(curr->left)); 
    // } 
    // return curr; 
    Node* node = curr; 
    while (node->left != NULL) { 
     node = node->left; 
    } 
    return node; 

} 
+0

但這是一棵二叉樹,而不是鏈表 –

回答

1

這是一些可怕的僞代碼,一目瞭然它甚至不看的權利(如果這是一個二叉搜索樹,因爲BST將指示,則盤旋的部分是錯誤的)。互聯網上有更多關於二叉搜索樹的信息。

在任何情況下,你想找到右子樹最小的元素,因爲這將是比左子樹中的所有其他元素小於右子樹中的所有其他元素,但更大。

看起來你的最小功能是正確的。釋放後,您需要刪除對minNode的引用。所以(minNode->parent)->left = NULL或者稍微更乏味的東西,如果你沒有父指針。現在left只是指向內存中的空白空間,導致完全隨機的行爲。