[問題] 二元搜尋樹-刪除節點的演算法

看板C_and_CPP (C/C++)作者 (NA)時間14年前 (2011/08/31 20:42), 編輯推噓4(4016)
留言20則, 7人參與, 最新討論串1/1
在二元搜尋樹裡 我看不懂要刪除的節點左右還有節點的情況下的演算法 也就是其中的這段: else{ tempNode=nodePtr->right; while(tempNode->left) tempNode=tempNode->left; tempNode->left=nodePtr->left; tempNode=nodePtr; nodePtr=nodePtr->right; delete tempNode; } 完整的演算法如下: 可以幫忙說明一下嗎orz 已經想了一個晚上了還是不懂 謝謝! void BinaryTree::deleteNode(int num,TreeNode *&nodePtr) { TreeNode *tempNode; if(num<nodePtr->data) deleteNode(num,nodePtr->left); else if (num>nodePtr->data) deleteNode(num,nodePtr->right); else{ if(nodePtr==NULL) cout<<"NUll node can not be deleted"; else if(nodePtr->right==NULL) { nodePtr=nodePtr->left; } else if(nodePtr->left==NULL) { nodePtr=nodePtr->right; } else{ tempNode=nodePtr->right; while(tempNode->left) tempNode=tempNode->left; tempNode->left=nodePtr->left; tempNode=nodePtr; nodePtr=nodePtr->right; delete tempNode; } showPreOrder(root); } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 68.70.61.100

08/31 20:45, , 1F
你知道 binary search tree 是怎麼排資料的嗎?
08/31 20:45, 1F

08/31 20:46, , 2F
當左右子樹都存在時,選右子樹的最左邊節點來替代被刪除的
08/31 20:46, 2F

08/31 20:46, , 3F
節點,可以保證大小順序不被破壞。
08/31 20:46, 3F

08/31 20:48, , 4F
不過有沒有漏?
08/31 20:48, 4F

08/31 21:15, , 5F
當你只是要交作業具有BST的效果,然後刪除真的做不出來
08/31 21:15, 5F

08/31 21:15, , 6F
有一個好方法就是多加一個計數器欄位,輸入的時候就+1
08/31 21:15, 6F

08/31 21:16, , 7F
或是看情況是維持1還是+1,刪除的時候就-1或是變0
08/31 21:16, 7F

08/31 21:16, , 8F
輸出的時候只要輸出>0的部分就好,不過前提是
08/31 21:16, 8F

08/31 21:16, , 9F
你如果是一個很大的程式需要好的時間速度的話,就不能這樣搞
08/31 21:16, 9F

08/31 21:17, , 10F
刪除太多點然後輸出還每次經過會太慢,如果只是作業....
08/31 21:17, 10F

08/31 21:56, , 11F
這樣刪除 高度會變耶...
08/31 21:56, 11F

08/31 22:05, , 12F
高度會一直增加,不過不是AVL要旋轉的話倒是可以使用
08/31 22:05, 12F

08/31 22:08, , 13F
調整一下刪除的方式就可以 避免了
08/31 22:08, 13F

08/31 22:53, , 14F
右邊的比該節點大 左邊的比該節點小 右枝的最左邊
08/31 22:53, 14F

08/31 22:54, , 15F
即是比他大的中最小者 拿來取代原本的節點不會破壞結構
08/31 22:54, 15F

08/31 22:55, , 16F
不過 原本指向右子樹最左邊的那個節點 要改指為null吧?
08/31 22:55, 16F

08/31 23:10, , 17F
要先free完再null
08/31 23:10, 17F

08/31 23:18, , 18F
但是假如沒有balance的話就還要在判斷
08/31 23:18, 18F

09/01 00:17, , 19F
我也看不懂 :) , 這有寫錯吧.
09/01 00:17, 19F

09/01 20:58, , 20F
謝謝大家 我再參透一下...
09/01 20:58, 20F
文章代碼(AID): #1ENYmdQd (C_and_CPP)
文章代碼(AID): #1ENYmdQd (C_and_CPP)