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

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

Links booklink

Contact Us: admin [ a t ] ucptt.com