遍歷,無非就是要把所有結點都找到,而算法的講究,是儘力使結點祗訪問一次,覺得這樣花費最少(其實遞歸本身就是很大的花費,不是祗講訪問次數的,不過傳統的算法就這樣看)。所以,當你寫出的代碼,能够把結構的所有結點都無遺漏地找出來,就算是可以了,至於效率,是見仁見智。其實,選擇哪種遍歷算法,是要視二叉樹的實際情況的,當樹很深時,遞歸會有風險,即容易棧溢出,也慢,此時可以考慮廣度優先的算法(你現在研究的是深度優先算法),那個用隊列,理解上比遞歸容易一點。
選用樹形結構,本來是視數據而定的,其使用與結點的插入有關,如果沒有一定的插入規律,那就會造成無必要地遍歷整棵樹的情形(這與數組沒排序要查找特定數據時祇能遍歷數組相似),結合插入規律,實際上要遍歷整棵樹的情形很少,遍歷算法,更多時候是用於輸出樹形圖。樹的作用,從一點結點開始選擇哪一路子孫,才是最關鍵的,整個數據分佈都要按某種規律把數據放到相應的支路上,這樣才能發揮樹的作用,不必動不動就遍歷。
做什麽事,都要講目的,目的是要把所有結點都找出來,那麽祇要找齊了,就是對的。考試,就如武術表演,講究姿勢正確,套路完整,否則不得分,但實戰是另一回事。很多時候,在現實應用中,做某些事的時候,已經順帶把所有結點都找出來以方便訪問的形式放到“索引”中了,不是非要再做一次算法不可。
算法和數據結構,都是活學活用的東西,所以屬於高級課程,也不是祗在C/C++語言中用的,思想最重要,用的時候,也要靈活,把遍歷算法練到滚瓜爛熟,也不表示實際上會用,因爲實際上它是化在程序的方方面面中,與整個程序的設計有關,一開始就有意識地選擇數據結構的,而數據的結構中安放什麽項目,也是靈活的,不是人家説樹祇有子結點指針,你就祗做這樣的結構,自己多放幾個方便尋訪的指針或別的什麽(加上父指針,遞歸幹嘛),也可以簡化算法——爲什麽非要用固定的算法不可?
[此贴子已经被作者于2016-2-12 13:46编辑过]