最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

圖解二叉樹(shù)的三種遍歷方式及java實(shí)現(xiàn)代碼

 更新時(shí)間:2017年07月07日 11:56:43   作者:Acamy丶  
本篇文章主要介紹了圖解二叉樹(shù)的三種遍歷方式及java實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,有興趣的可以了解一下

二叉樹(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java時(shí)間轉(zhuǎn)換成unix時(shí)間戳的方法

    Java時(shí)間轉(zhuǎn)換成unix時(shí)間戳的方法

    這篇文章主要為大家詳細(xì)介紹了Java時(shí)間轉(zhuǎn)換成unix時(shí)間戳的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • SpringBoot SpEL語(yǔ)法掃盲與查詢手冊(cè)的實(shí)現(xiàn)

    SpringBoot SpEL語(yǔ)法掃盲與查詢手冊(cè)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot SpEL語(yǔ)法掃盲與查詢手冊(cè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • JAVA面向?qū)ο笾^承?super入門解析

    JAVA面向?qū)ο笾^承?super入門解析

    在JAVA類中使用super來(lái)引用父類的成分,用this來(lái)引用當(dāng)前對(duì)象,如果一個(gè)類從另外一個(gè)類繼承,我們new這個(gè)子類的實(shí)例對(duì)象的時(shí)候,這個(gè)子類對(duì)象里面會(huì)有一個(gè)父類對(duì)象。怎么引用里面的父類對(duì)象呢?用super來(lái)引用,this指當(dāng)前對(duì)象的引用,super是當(dāng)前對(duì)象里面的父對(duì)象的引用
    2022-01-01
  • Java實(shí)現(xiàn)創(chuàng)建運(yùn)行時(shí)類的對(duì)象操作示例

    Java實(shí)現(xiàn)創(chuàng)建運(yùn)行時(shí)類的對(duì)象操作示例

    這篇文章主要介紹了Java實(shí)現(xiàn)創(chuàng)建運(yùn)行時(shí)類的對(duì)象操作,結(jié)合實(shí)例形式分析了Java動(dòng)態(tài)創(chuàng)建對(duì)象的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • springboot運(yùn)行時(shí)新增/更新外部接口的實(shí)現(xiàn)方法

    springboot運(yùn)行時(shí)新增/更新外部接口的實(shí)現(xiàn)方法

    這篇文章主要介紹了springboot運(yùn)行時(shí)新增/更新外部接口的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • spring框架配置實(shí)體類復(fù)雜屬性注入xml文件過(guò)程詳解

    spring框架配置實(shí)體類復(fù)雜屬性注入xml文件過(guò)程詳解

    這篇文章主要介紹了spring框架配置實(shí)體類復(fù)雜屬性注入xml文件過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • MybatisPlus中如何調(diào)用Oracle存儲(chǔ)過(guò)程

    MybatisPlus中如何調(diào)用Oracle存儲(chǔ)過(guò)程

    這篇文章主要介紹了MybatisPlus中如何調(diào)用Oracle存儲(chǔ)過(guò)程的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 微信小程序錄音文件格式silk遇到的問(wèn)題及解決方法

    微信小程序錄音文件格式silk遇到的問(wèn)題及解決方法

    錄音文件為silk格式,說(shuō)是silk其實(shí)是base64加密后的webm格式,只需將其轉(zhuǎn)為webm格式即可。但是在處理過(guò)程中遇到各種坑,下面小編給大家?guī)?lái)了微信小程序錄音文件格式silk遇到的問(wèn)題及解決方法,感興趣的朋友一起看看吧
    2018-09-09
  • SpringBoot整合Redis使用注解進(jìn)行緩存方式

    SpringBoot整合Redis使用注解進(jìn)行緩存方式

    文章介紹了使用Redis進(jìn)行數(shù)據(jù)緩存的幾種方式,包括手動(dòng)配置RedisTemplate、使用Spring的Caching模塊以及配置自定義的RedisCacheManager
    2025-03-03
  • MybatisPlus lambdaQueryWrapper中常用方法的使用

    MybatisPlus lambdaQueryWrapper中常用方法的使用

    本文主要介紹了MybatisPlus lambdaQueryWrapper中常用方法的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

门源| 中宁县| 屯昌县| 社旗县| 阿瓦提县| 丹东市| 昌乐县| 六枝特区| 睢宁县| 江达县| 江达县| 沭阳县| 平陆县| 屏边| 刚察县| 新沂市| 平顺县| 金昌市| 株洲市| 张家川| 宜兴市| 乐陵市| 黑河市| 阳春市| 阜新| 靖安县| 大厂| 含山县| 商南县| 灌云县| 鄢陵县| 广河县| 昔阳县| 仙游县| 兰溪市| 湖州市| 临漳县| 涡阳县| 斗六市| 香港| 康平县|