[问题] 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