為什麼說二叉樹遍歷用遞迴的方法不如非遞迴方法

時間 2021-05-11 13:45:06

1樓:薛瑄

雖然從時間複雜度來看,二叉樹遍歷遞迴和迭代都是O(logn),但是這裡的常係數相差甚大。

也就是說遞迴 O(a*Logn),迭代是O(b*Logn),這裡的a>>b

用鄧教授更通俗的說法是,1秒和1年都是O(1),但是他們的常係數相差甚遠。

B樹和平衡二叉搜尋樹,查詢時間複雜度是O(logn),但是常係數相差很大 (由B樹的階次決定,這裡沒有考慮IO係數)

2樓:太上玄元道君

遞迴可能會出問題。虛擬機會對每一層方法呼叫生成棧幀放在棧空間內,而棧空間是很有限的,因此當呼叫層數比較深的時候,棧空間可能會溢位。

3樓:懶得起名

小白來回答一下,希望大家能指出我說的不準確的地方。遞迴呼叫的時候要把要把當前變數全都壓入棧裡,等函式返回後把壓入棧的都恢復回來,這個要花一定的時間。遞迴的時候會發生函式的跳轉,這個也費時間。

但是這些開銷在資料只有幾萬的時候也不太明顯。

4樓:高洪濤

遞迴是函式自身呼叫自身,涉及到保護現場(變數入棧,記錄位址等),時間和空間開銷較大,而這操作都是在棧上,呼叫層級太多很容易溢位。

迭代(非遞迴)雖然也是用棧,可是這個棧和遞迴棧可不是乙個概念,這個棧完全可以在堆上開闢,空間更大,不容易溢位。迭代也不涉及函式呼叫,效率也更高。

關於函式呼叫的過程,題主可參考我的部落格:棧與呼叫慣例

5樓:廖祥俐

最明顯的是在於堆疊深度吧

由於你不知道二叉樹的高度,堆疊深度不確定,如果過深,則會導致棧溢位

而且遞迴方法,每次呼叫到會導致系統對棧空間進行分配處理,自然導致的效率不高,這方面資訊考慮進去,常常就會要求非遞迴解了。

6樓:

這個問題過於片面。二叉樹遍歷策略其實很多,有些就適合用遞迴實現,有些用迭代更加。很多時候,你要選擇的是遍歷策略,而不是遞迴還是迭代。簡單來說,具體問題具體分析。

為什麼說「滿二叉樹也是完全二叉樹」?

一名 1 先明確完全二叉樹的概念。先上圖!完全二叉樹分為樓主所說的 圖1就是了 還有一種完全二叉樹是圖2。圖2也是完全二叉樹!圖2也是完全二叉樹!圖2也是完全二叉樹!概念 完全二叉樹分為兩種,1 最後一層沒有滿,那麼最後一層的節點都得在左邊。2 最後一層滿了,那就得全滿才行,圖2。完全二叉樹就這麼個...

為什麼二叉樹的前序遍歷和中序遍歷對應入棧和出棧次序?

碳酸鈉 實際上比較一下前序和中序的迴圈遍歷演算法就容易懂了 前序和中序的區別在於訪問結點的位置不同 前序是在入棧時訪問,而中序是在出棧時訪問。具體來講,前序的訪問語句在每次壓棧時就會執行,中序的訪問語句在左子樹不斷壓棧,直到在最左處退棧時才執行,是不是符合印象中的遍歷順序?正是因為前序和中序依附於同...

看見二叉樹的各種遞迴演算法就倒了怎麼辦?

維1111 自問自答 最近找到一本書,感覺讓我看懂了遞迴 1 對原問題f s 進行分析,假設出合理的 較小問題 與數學歸納法中的假設n k 1是等式成立相似 2 假設f s 是可解的,即給出f s 與f s 之間的關係 與數學歸納法中的求證n k時等式成立的過程相似 3 確定乙個特定情況 如f 0 ...