圖解二叉樹(shù)的三種遍歷方式及java實(shí)現(xiàn)代碼
二叉樹(shù)(binary tree)是一顆樹(shù),其中每個(gè)節(jié)點(diǎn)都不能有多于兩個(gè)的兒子。
1.二叉樹(shù)節(jié)點(diǎn)
作為圖的特殊形式,二叉樹(shù)的基本組成單元是節(jié)點(diǎn)與邊;作為數(shù)據(jù)結(jié)構(gòu),其基本的組成實(shí)體是二叉樹(shù)節(jié)點(diǎn)(binary tree node),而邊則對(duì)應(yīng)于節(jié)點(diǎn)之間的相互引用。
如下,給出了二叉樹(shù)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)圖示和相關(guān)代碼:
// 定義節(jié)點(diǎn)類: private static class BinNode { private Object element; private BinNode lChild;// 定義指向左子樹(shù)的指針 private BinNode rChild;// 定義指向右子樹(shù)的指針 public BinNode(Object element, BinNode lChild, BinNode rChild) { this.element = element; this.lChild = lChild; this.rChild = rChild; } }
2.遞歸遍歷
二叉樹(shù)本身并不具有天然的全局次序,故為實(shí)現(xiàn)遍歷,需通過(guò)在各節(jié)點(diǎn)與其孩子之間約定某種局部次序,間接地定義某種全局次序。
按慣例左兄弟優(yōu)先于右兄弟,故若將節(jié)點(diǎn)及其孩子分別記作V、L和R,則下圖所示,局部訪問(wèn)的次序可有VLR、LVR和LRV三種選擇。根據(jù)節(jié)點(diǎn)V在其中的訪問(wèn)次序,三種策略也相應(yīng)地分別稱作先序遍歷、中序遍歷和后序遍歷,下面將分別介紹。
2.1 先序遍歷
圖示:
代碼實(shí)現(xiàn):
/** * 對(duì)該二叉樹(shù)進(jìn)行前序遍歷 結(jié)果存儲(chǔ)到list中 前序遍歷 */ public static void preOrder(BinNode node) { list.add(node); // 先將根節(jié)點(diǎn)存入list // 如果左子樹(shù)不為空繼續(xù)往左找,在遞歸調(diào)用方法的時(shí)候一直會(huì)將子樹(shù)的根存入list,這就做到了先遍歷根節(jié)點(diǎn) if (node.lChild != null) { preOrder(node.lChild); } // 無(wú)論走到哪一層,只要當(dāng)前節(jié)點(diǎn)左子樹(shù)為空,那么就可以在右子樹(shù)上遍歷,保證了根左右的遍歷順序 if (node.rChild != null) { preOrder(node.rChild); } }
2.2 中序遍歷
圖示:
代碼實(shí)現(xiàn):
/** * 對(duì)該二叉樹(shù)進(jìn)行中序遍歷 結(jié)果存儲(chǔ)到list中 */ public static void inOrder(BinNode node) { if (node.lChild != null) { inOrder(node.lChild); } list.add(node); if (node.rChild != null) { inOrder(node.rChild); } }
2.3 后序遍歷
實(shí)例圖示:
代碼實(shí)現(xiàn):
/** * 對(duì)該二叉樹(shù)進(jìn)行后序遍歷 結(jié)果存儲(chǔ)到list中 */ public static void postOrder(BinNode node) { if (node.lChild != null) { postOrder(node.lChild); } if (node.rChild != null) { postOrder(node.rChild); } list.add(node); }
附:測(cè)試相關(guān)代碼
private static BinNode root; private static List<BinNode> list = new ArrayList<BinNode>(); public static void main(String[] args) { init(); // TODO Auto-generated method stub //preOrder(root); //inOrder(root); postOrder(root); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i).element + " "); } } // 樹(shù)的初始化:先從葉節(jié)點(diǎn)開(kāi)始,由葉到根 public static void init() { BinNode b = new BinNode("b", null, null); BinNode a = new BinNode("a", null, b); BinNode c = new BinNode("c", a, null); BinNode e = new BinNode("e", null, null); BinNode g = new BinNode("g", null, null); BinNode f = new BinNode("f", e, g); BinNode h = new BinNode("h", f, null); BinNode d = new BinNode("d", c, h); BinNode j = new BinNode("j", null, null); BinNode k = new BinNode("k", j, null); BinNode m = new BinNode("m", null, null); BinNode o = new BinNode("o", null, null); BinNode p = new BinNode("p", o, null); BinNode n = new BinNode("n", m, p); BinNode l = new BinNode("l", k, n); root = new BinNode("i", d, l); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C++二叉樹(shù)結(jié)構(gòu)的建立與基本操作
- C語(yǔ)言實(shí)現(xiàn)二叉樹(shù)的基本操作
- JS中的二叉樹(shù)遍歷詳解
- python數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的建立實(shí)例
- 平衡二叉樹(shù)的左右旋以及雙旋轉(zhuǎn)的圖文詳解
- c++二叉樹(shù)的幾種遍歷算法
- C語(yǔ)言中計(jì)算二叉樹(shù)的寬度的兩種方式
- 關(guān)于c#二叉樹(shù)的實(shí)現(xiàn)
- python數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的遍歷實(shí)例
- 二叉樹(shù)入門和刷題詳解
相關(guān)文章
IDEA SpringBoot:Cannot resolve configuration&
這篇文章主要介紹了IDEA SpringBoot:Cannot resolve configuration property配置文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫
這篇文章主要介紹了學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫,這個(gè)日歷小程序僅用簡(jiǎn)單的算法實(shí)現(xiàn)沒(méi)有用到date類等,但是帶有圖形界面,需要的朋友可以參考下2016-02-02SpringBoot中YAML語(yǔ)法及幾個(gè)注意點(diǎn)說(shuō)明
這篇文章主要介紹了SpringBoot中YAML語(yǔ)法及幾個(gè)注意點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SWT(JFace) Menu、Bar...體驗(yàn)代碼
SWT(JFace)體驗(yàn)之Menu、Bar實(shí)現(xiàn)代碼。2009-06-06java 中HttpClient傳輸xml字符串實(shí)例詳解
這篇文章主要介紹了java 中HttpClient傳輸xml字符串實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04如何使用stream從List對(duì)象中獲取某列數(shù)據(jù)
這篇文章主要介紹了如何使用stream從List對(duì)象中獲取某列數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Java多線程實(shí)現(xiàn)聊天客戶端和服務(wù)器
這篇文章主要為大家詳細(xì)介紹了Java多線程聊天客戶端和服務(wù)器實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10