看板 C_and_CPP 關於我們 聯絡資訊
請問二元樹裡面走訪所有的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
Schottky: 呃,你知道什麼叫 function call 嗎? 06/14 15:13
Schottky: function 最後會 return 回到 caller 啊 06/14 15:14
Schottky: 別逃避了好好把函式呼叫和遞迴弄懂吧 XD 06/14 15:15
Neisseria: 初學遞迴會鬼打牆還蠻正常的 XD 06/14 15:24
kobe8112: 我比較不能理解你標點符號的用法(逃 06/14 15:29
sarafciel: 請好好搞懂遞迴跟函式流程 這是很重要的程式觀念 06/14 15:35
descent: 建議用 debugger 來單步追縱, 這個本來就很難懂 06/14 15:46
BIGbirddy: 這想好了 06/14 17:22
BIGbirddy: 第一次的in order會把整棵left subtree都印完才會印r 06/14 17:22
MOONRAKER: 他沒有回去上一層,就這樣。 06/14 17:22
MOONRAKER: 你畫一個五節點的樹 自己用紙筆跑一遍 06/14 17:23
cphe: 改用迴圈網路上找就有了吧 不過你遞迴看不懂改寫我猜你更 06/15 15:30
cphe: 看不懂 06/15 15:30
Neisseria: 二元樹不用遞迴反而比較難寫 06/15 17:42
Killercat: 其實不見得,需要一個stack把每次loop的時候content 06/15 23:33
Killercat: 記起來,除此以外應該差不多 06/15 23:33
Killercat: 之前有拆解過一個過深的遞迴成loop 後來發現也還好 06/15 23:34
Killercat: 但是遞迴絕對比loop直覺好懂就是... 06/15 23:34
Schottky: 二元樹看實作方式也可以做成用loop走訪卻不使用stack, 06/16 01:10
Schottky: 比如說每個節點除了往左和往右的指標外還有向上的指標 06/16 01:10
Schottky: 講這個只是要告訴原PO,迴圈反而是高級技巧 06/16 01:11
sarafciel: 這樣講啦 能用迴圈簡單寫的東西就不會有人用遞迴寫 06/16 08:29
sarafciel: 反過來說 會寫成遞迴除非是教學 不然就是它寫成迴圈會 06/16 08:31
sarafciel: 很麻煩 所以請看懂它 如果今天你跟人合作寫程式 06/16 08:42
sarafciel: 你因為看不懂遞迴叫他改迴圈 他肯改那是他佛心 06/16 08:43
sarafciel: 但更有可能的情況是他會翻白眼給你看XDD 06/16 08:44
Killercat: 一般來說 遞迴寫出來以後改迴圈 會比直接迴圈簡單 06/16 09:52
Killercat: 最難的就是叫你把迴圈改遞迴 囧 06/16 09:52
Killercat: 所以還是先用遞迴寫出來吧 06/16 09:53
james80351: 可以拿紙筆畫看看函式怎麼呼叫 06/16 13:34
k387259: 請愛用逐步執行 06/21 12:10
liflguy: stack的概念,慢慢疊上去再慢慢拿下來 07/01 18:20