[問題] 請問二元樹裡面的遞迴???

看板C_and_CPP作者 (我的雞巴女友)時間7年前 (2018/06/14 15:01), 編輯推噓10(10022)
留言32則, 12人參與, 7年前最新討論串1/1
請問二元樹裡面走訪所有的Node各本上寫的和網路上寫的都是下面 這樣 void inorderLDR(bt ptr) { if(ptr==NULL) return; inorderLDR(ptr->left_child); printf("%c",ptr->data); inorderLDR(ptr->right_child); } 但是我很不能理解的是??當往左邊找到最後一的Node的時候 他下面的Left和Right都是Null所以printf 最後一個Node 但是他又是怎麼會到上層的Nonde???????? 因為ptr->left_child 和ptr_right_child不管怎麼看 都是往下面左右的找節點啊!!!這個程式碼是怎麼在迴車 到上一層的節點?? 請問有人可以幫我改成不要用遞迴的方式嗎?? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.98.153 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1528959686.A.BE9.html

06/14 15:13, 7年前 , 1F
呃,你知道什麼叫 function call 嗎?
06/14 15:13, 1F

06/14 15:14, 7年前 , 2F
function 最後會 return 回到 caller 啊
06/14 15:14, 2F

06/14 15:15, 7年前 , 3F
別逃避了好好把函式呼叫和遞迴弄懂吧 XD
06/14 15:15, 3F

06/14 15:24, 7年前 , 4F
初學遞迴會鬼打牆還蠻正常的 XD
06/14 15:24, 4F

06/14 15:29, 7年前 , 5F
我比較不能理解你標點符號的用法(逃
06/14 15:29, 5F

06/14 15:35, 7年前 , 6F
請好好搞懂遞迴跟函式流程 這是很重要的程式觀念
06/14 15:35, 6F

06/14 15:46, 7年前 , 7F
建議用 debugger 來單步追縱, 這個本來就很難懂
06/14 15:46, 7F

06/14 17:22, 7年前 , 8F
這想好了
06/14 17:22, 8F

06/14 17:22, 7年前 , 9F
第一次的in order會把整棵left subtree都印完才會印r
06/14 17:22, 9F

06/14 17:22, 7年前 , 10F
他沒有回去上一層,就這樣。
06/14 17:22, 10F

06/14 17:23, 7年前 , 11F
你畫一個五節點的樹 自己用紙筆跑一遍
06/14 17:23, 11F

06/15 15:30, 7年前 , 12F
改用迴圈網路上找就有了吧 不過你遞迴看不懂改寫我猜你更
06/15 15:30, 12F

06/15 15:30, 7年前 , 13F
看不懂
06/15 15:30, 13F

06/15 17:42, 7年前 , 14F
二元樹不用遞迴反而比較難寫
06/15 17:42, 14F

06/15 23:33, 7年前 , 15F
其實不見得,需要一個stack把每次loop的時候content
06/15 23:33, 15F

06/15 23:33, 7年前 , 16F
記起來,除此以外應該差不多
06/15 23:33, 16F

06/15 23:34, 7年前 , 17F
之前有拆解過一個過深的遞迴成loop 後來發現也還好
06/15 23:34, 17F

06/15 23:34, 7年前 , 18F
但是遞迴絕對比loop直覺好懂就是...
06/15 23:34, 18F

06/16 01:10, 7年前 , 19F
二元樹看實作方式也可以做成用loop走訪卻不使用stack,
06/16 01:10, 19F

06/16 01:10, 7年前 , 20F
比如說每個節點除了往左和往右的指標外還有向上的指標
06/16 01:10, 20F

06/16 01:11, 7年前 , 21F
講這個只是要告訴原PO,迴圈反而是高級技巧
06/16 01:11, 21F

06/16 08:29, 7年前 , 22F
這樣講啦 能用迴圈簡單寫的東西就不會有人用遞迴寫
06/16 08:29, 22F

06/16 08:31, 7年前 , 23F
反過來說 會寫成遞迴除非是教學 不然就是它寫成迴圈會
06/16 08:31, 23F

06/16 08:42, 7年前 , 24F
很麻煩 所以請看懂它 如果今天你跟人合作寫程式
06/16 08:42, 24F

06/16 08:43, 7年前 , 25F
你因為看不懂遞迴叫他改迴圈 他肯改那是他佛心
06/16 08:43, 25F

06/16 08:44, 7年前 , 26F
但更有可能的情況是他會翻白眼給你看XDD
06/16 08:44, 26F

06/16 09:52, 7年前 , 27F
一般來說 遞迴寫出來以後改迴圈 會比直接迴圈簡單
06/16 09:52, 27F

06/16 09:52, 7年前 , 28F
最難的就是叫你把迴圈改遞迴 囧
06/16 09:52, 28F

06/16 09:53, 7年前 , 29F
所以還是先用遞迴寫出來吧
06/16 09:53, 29F

06/16 13:34, 7年前 , 30F
可以拿紙筆畫看看函式怎麼呼叫
06/16 13:34, 30F

06/21 12:10, 7年前 , 31F
請愛用逐步執行
06/21 12:10, 31F

07/01 18:20, 7年前 , 32F
stack的概念,慢慢疊上去再慢慢拿下來
07/01 18:20, 32F
文章代碼(AID): #1R8XB6lf (C_and_CPP)