二叉樹 2 遍歷的非遞迴實現

2021-08-27 12:46:50 字數 1024 閱讀 4276

遞迴演算法簡潔明瞭、可讀性好,但與非遞迴演算法相比要消耗更多的時間和儲存空間。為提高效率,我們可採用一種非遞迴的二叉樹遍歷演算法。非遞迴的實現要借助棧來實現,因為堆疊的先進後出的結構和遞迴很相似。

對於中序遍歷來說,非遞迴的演算法比遞迴演算法的效率要高的多。其中序遍歷演算法的實現的過程如下:

(1).初始化棧,根結點進棧;

(2).若棧非空,則棧頂結點的左孩子結點相繼進棧,直到null(到葉子結點時)退棧;訪問棧頂結點(執行visit操作)並使棧頂結點的右孩子結點進棧成為棧頂結點。

(3).重複執行(2),直至棧為空。

package datastructure.tree;

import datastructure.stack.arraystack;

import datastructure.stack.stack;

public class unrecorderbtree implements visit

public void inorder(btree boot)

//如果該結點沒有右孩子,則逐級往上出棧

while(!stack.isempty() &&!( (btree)stack.peek() ).hasrighttree())

//如果該結點有右孩子,則右孩子進棧

要構建的樹

package datastructure.tree;

/** * 測試二叉樹

* @author administrator

* */

public class btreetest

}

結果如下:

中序遍歷:

d b ae c f

二叉樹遍歷 遞迴 非遞迴實現

先序遍歷中序遍歷 後序遍歷 根結點 左子樹 右子樹 左子樹 根子樹 右子樹 左子樹 右子樹 根結點 先序遍歷 void preorder btree t 中序遍歷 void inorder btree t 後序遍歷 void postorder btree t 遞迴 recursion 就是子程式 ...

二叉樹遍歷的非遞迴實現

最近在看二叉樹的非遞迴呼叫,書上 寫的蠻清楚,但是一些細節需要深入的思考才會理解掌握。先根遍歷比較簡單,不斷的尋找根的左節點,並輸出,同時將對應節點的右節點壓入棧中,直到左節點為空,將棧頂元素出棧,作為根重複上述操作,直到棧為空。中根遍歷,將根節點左節點,左節點的左節點.依次入棧,直到最後乙個無左節...

遍歷二叉樹的非遞迴實現

對於二叉樹來說,只要按照下面的模板可以很容易地實現先序 中序和後序的遞迴遍歷二叉樹。void visit treenode node 使用遞迴可以使 變得簡潔,明了。我們不用考慮計算機底層的遞迴工作棧是怎麼實現的,只要寫好遞迴式,給出遞迴終止條件,就可以把剩餘的計算工作交給計算機去執行。所以說遞迴是...