二叉树(2)——遍历的非递归实现
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
算法概述
遞歸算法簡(jiǎn)潔明了、可讀性好,但與非遞歸算法相比要消耗更多的時(shí)間和存儲(chǔ)空間。為提高效率,我們可采用一種非遞歸的二叉樹(shù)遍歷算法。非遞歸的實(shí)現(xiàn)要借助棧來(lái)實(shí)現(xiàn),因?yàn)槎褩5南冗M(jìn)后出的結(jié)構(gòu)和遞歸很相似。
對(duì)于中序遍歷來(lái)說(shuō),非遞歸的算法比遞歸算法的效率要高的多。其中序遍歷算法的實(shí)現(xiàn)的過(guò)程如下:
(1).初始化棧,根結(jié)點(diǎn)進(jìn)棧;
(2).若棧非空,則棧頂結(jié)點(diǎn)的左孩子結(jié)點(diǎn)相繼進(jìn)棧,直到null(到葉子結(jié)點(diǎn)時(shí))退棧;訪問(wèn)棧頂結(jié)點(diǎn)(執(zhí)行visit操作)并使棧頂結(jié)點(diǎn)的右孩子結(jié)點(diǎn)進(jìn)棧成為棧頂結(jié)點(diǎn)。
(3).重復(fù)執(zhí)行(2),直至棧為空。
算法實(shí)現(xiàn)
?
package datastructure.tree;import datastructure.stack.ArrayStack; import datastructure.stack.Stack;public class UnrecOrderBTree implements Visit{private Stack stack = new ArrayStack();private BTree bt;@Overridepublic void visit(BTree btree) {System.out.print("\t" + btree.getRootData());}public void inOrder(BTree boot) {stack.clear();stack.push(boot);while(!stack.isEmpty()) {//左孩子結(jié)點(diǎn)進(jìn)棧while((bt = ((BTree)(stack.peek())).getLeftChild()) != null) {stack.push(bt);}//如果該結(jié)點(diǎn)沒(méi)有右孩子,則逐級(jí)往上出棧while(!stack.isEmpty() &&!( (BTree)stack.peek() ).hasRightTree()) {bt = (BTree)stack.pop();visit(bt);}//如果該結(jié)點(diǎn)有右孩子,則右孩子進(jìn)棧if(!stack.isEmpty() && ( (BTree)stack.peek() ).hasRightTree()){bt = (BTree)stack.pop();visit(bt);stack.push(bt.getRightChild());}}}}測(cè)試:
要構(gòu)建的樹(shù)
package datastructure.tree; /*** 測(cè)試二叉樹(shù)* @author Administrator**/ public class BTreeTest {public static void main(String args[]) {BTree btree = new LinkBTree('A');BTree bt1, bt2, bt3, bt4;bt1 = new LinkBTree('B');btree.addLeftTree(bt1);bt2 = new LinkBTree('D');bt1.addLeftTree(bt2);bt3 = new LinkBTree('C');btree.addRightTree(bt3);bt4 = new LinkBTree('E');bt3.addLeftTree(bt4);bt4 = new LinkBTree('F');bt3.addRightTree(bt4);RecursionOrderBTree order = new RecursionOrderBTree();System.out.println("\n中序遍歷:");order.inOrder(btree);} }
結(jié)果如下:
中序遍歷:
D B ?A?E C ? F
轉(zhuǎn)載于:https://my.oschina.net/verynix/blog/365910
總結(jié)
以上是生活随笔為你收集整理的二叉树(2)——遍历的非递归实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 自定义菜单用例
- 下一篇: MyBatis中如何通过继承SqlSes