[問題] Binary Search Tree實作問題

作者: AmigoSin (JohnWall)   2020-09-08 13:57:27
各位大神好~
肥宅我最近複習資料結構,
在BST的Insertion遇到了一點問題。
程式碼如下網址
https://reurl.cc/WLrA99
註解的部分是本肥手動Insertion,
測出來結果都正確。
目前已知函式運作後,
node有成功new出來,
但parent 沒有指到new出來的node,
請問我的寫法哪裡有問題QQ?
是因為遞迴呼叫到Leaf的時候,
Leaf的child pointer指向NULL,
而函式複製了一份NULL傳進去遞迴,
所以這個NULL不是原本指向的NULL?
(Call by value?)
**
補充說明:
參考置頂的新手十三誡文的第13點後
我使用pointer to pointer終於能成功了
(果然還是要多爬文)
雖然我還在理解為何一階pointer不能成功XD
非常謝謝各位熱心的回文指點!
原始版本:https://i.imgur.com/MACCGeW.png
二階指標版本:https://i.imgur.com/sIEmi1j.png
參考文章:https://i.imgur.com/nBqyKym.png
手機排版請見諒><
作者: b0920075 (Void)   2020-09-08 14:24:00
新new的Node沒給上一層的Node阿
作者: NTUmaki (西木野真姬)   2020-09-08 14:27:00
你的insertion 函式沒有回傳值
作者: AmigoSin (JohnWall)   2020-09-08 15:22:00
https://i.imgur.com/boGi2zh.jpg抱歉各位我的指標觀念不太好newNode(30) 回傳的新Node位址,assign給rootroot是上一個遞迴的root->right,這樣做會連不上嗎我知道有方法是把Node指標當作函式的回傳類型去實作我只是想釐清我指標的盲點QQ謝謝1F和2F大大的留言
作者: NTUmaki (西木野真姬)   2020-09-08 15:42:00
我剛剛測試你的寫法 直接傳Null進去new 然後輸出位址會是0x0 函式改成有回傳值的就會有位址我也沒想過這種寫法@@ 不過實際測試出來你這樣寫 最後root的child pointer 會沒位址
作者: loveme00835 (髮箍)   2020-09-08 16:13:00
你可以在 Insertion() 前後觀察一下指標值有無變化,你只有改到參數, 而不是傳進來的指標物件本身
作者: AmigoSin (JohnWall)   2020-09-08 16:19:00
謝謝NTU大大幫我測試XD 我怕如果不釐清其中的運作機制,以後還是會生出這種可怕的code (掩面)謝謝Love大!所以pointer當參數只是複製一份和pointer相同的值(一樣的記憶體位置?)再傳到函式裡面作用對嗎那我傳進去NULL和函式裡面的NULL如果位置一樣,應該會指向同一個生出來的物件會,這樣觀念對嗎?1. 是因為傳進來當參數的NUL和原本的right的NULL實際上指向不同的位置嗎?2. 還是因為NULL根本不指向任何記憶體的實際位置,只有在我new的時候才分配記憶體位置給該層遞迴指向的NULL。所以我new出來的物件只停留在newNode的那層遞迴,原本的child則沒有改到嗎?謝謝NTU大和Love大不厭其煩為我解答和測試><我測試new前後的結果,new出來的物件有記憶體位置和正確的data值,但回到上層遞迴後原本的right又變回NULL了謝謝各位,我看完置頂的新手十三誡第13點後好像明白了
作者: a27417332 (等號卡比)   2020-09-08 19:04:00
Insertion的第一個參數型別到底是Node*還是Node*&
作者: loveme00835 (髮箍)   2020-09-08 19:37:00
看到 *& 我就笑了 :D
作者: AmigoSin (JohnWall)   2020-09-08 20:22:00
哈哈哈*&是我剛剛參考置頂文章再測試XD我還在研究置頂的十三誡XDhttps://i.imgur.com/bcakQS4.png原本發問的程式碼,避免點進去看到我在亂改程式碼XD
作者: asd3136396 (新化王陽明)   2020-09-09 16:51:00
要往下遞迴Insertion(root->right, data);之前先檢查root->right == NULL是的話root->right = newnode(data);

Links booklink

Contact Us: admin [ a t ] ucptt.com