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

Java語(yǔ)言實(shí)現(xiàn)非遞歸實(shí)現(xiàn)樹(shù)的前中后序遍歷總結(jié)

 更新時(shí)間:2019年01月03日 14:35:04   作者:sdr_zd  
今天小編就為大家分享一篇關(guān)于Java語(yǔ)言實(shí)現(xiàn)非遞歸實(shí)現(xiàn)樹(shù)的前中后序遍歷總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

前言

三種遍歷的遞歸寫(xiě)法都很好寫(xiě),所以總結(jié)一下非遞歸寫(xiě)法。

先貼一張圖復(fù)習(xí)一下三種遍歷方式就進(jìn)入正文啦~

【注:本文所有代碼實(shí)現(xiàn)中樹(shù)的結(jié)點(diǎn)定義如下:

public class Node {
  int val;
  Node left;
  Node right;
  Node parent;
  Node() {}
  Node(int val) {
    this.val = val;
  }
}

1.前序遍歷

實(shí)現(xiàn)思路:

前序遍歷的順序是:根結(jié)點(diǎn) -> 左孩子 -> 右孩子

借助一個(gè)棧結(jié)構(gòu)先將根結(jié)點(diǎn)壓入棧,然后循環(huán)每次取出棧頂元素,直到棧為空。如果當(dāng)前結(jié)點(diǎn)有右孩子就先將右孩子壓入棧中,如果當(dāng)前結(jié)點(diǎn)有左孩子就將左孩子壓入棧中,這里注意順序,因?yàn)闂5慕Y(jié)構(gòu)是先進(jìn)后出的,為了保證先遍歷到左孩子就應(yīng)該后壓左孩子~

代碼實(shí)現(xiàn):

【代碼使用直接輸出的方式打印中序遍歷結(jié)果,也可以放入一個(gè)list中存儲(chǔ)~】

public void preOrder(Node head) {
    System.out.println("pre-order:");
    if(head != null) {
      Stack<Node> stack = new Stack<>();
      stack.push(head);
      while(!stack.isEmpty()) {
        head = stack.pop();
        System.out.print(head.val + " ");
        if (head.right != null)
          stack.push(head.right);
        if (head.left != null)
          stack.push(head.left);
      }
    }
  }

2.中序遍歷

實(shí)現(xiàn)思路:

中序遍歷的順序:左孩子 -> 根結(jié)點(diǎn) -> 右孩子

借助棧結(jié)構(gòu),將當(dāng)前結(jié)點(diǎn)的左孩子依次入棧直到?jīng)]有左孩子了就彈出棧頂元素并打印,如果彈出的結(jié)點(diǎn)有右孩子就將右孩子的左邊界依次入棧,循環(huán)…

比如文章開(kāi)始的那個(gè)圖中,先將A,B,D依次入棧,此時(shí)棧頂元素是D,彈出并打印,D結(jié)點(diǎn)有右孩子,將D的右孩子的左邊界依次入棧,壓入結(jié)點(diǎn)G,結(jié)點(diǎn)G沒(méi)有左孩子所以彈出并打印G,此時(shí)棧頂元素是B,循環(huán)…直到棧中為空且當(dāng)前結(jié)點(diǎn)為空時(shí)遍歷結(jié)束。

代碼實(shí)現(xiàn):

public static void inOrderTraverse(Node head) {
    System.out.println("in-order:");
    if(head != null) {
      Stack<Node> stack = new Stack<>();
      while(!stack.isEmpty() || head != null) {
        if(head != null) {
          // 當(dāng)前節(jié)點(diǎn)不為空, 將自己壓進(jìn)棧并將自己的左孩子作為當(dāng)前節(jié)點(diǎn)(壓入左邊界)
          stack.push(head);
          head = head.left;
        }else {
          // 當(dāng)前節(jié)點(diǎn)為空(沒(méi)有左孩子了), 將棧頂元素彈出作為當(dāng)前節(jié)點(diǎn), 并將當(dāng)前節(jié)點(diǎn)的右孩子壓進(jìn)棧
          head = stack.pop();
          System.out.print(head.val + " ");
          head = head.right;
        }
      }
    }
  }

3.后序遍歷

實(shí)現(xiàn)思路:

后序遍歷的順序:左孩子 -> 右孩子 -> 根結(jié)點(diǎn)

仔細(xì)想一下,打印每個(gè)結(jié)點(diǎn)需要訪問(wèn)根結(jié)點(diǎn)三次,先從根結(jié)點(diǎn)開(kāi)始找到左孩子,返回再找到右孩子,再返回到根結(jié)點(diǎn),需要訪問(wèn)根結(jié)點(diǎn)三次,直接按照當(dāng)前順序進(jìn)行遍歷不知如何下手,那么我們可以換一個(gè)角度去考慮。

棧結(jié)構(gòu)是先進(jìn)后出的,那我們不妨借助一個(gè)棧先存儲(chǔ) 根結(jié)點(diǎn) -> 右孩子 -> 左孩子 的結(jié)果,再將其依次彈出就是后序遍歷的順序了。

那實(shí)現(xiàn) 根結(jié)點(diǎn) -> 右孩子 -> 左孩子 的方法就很簡(jiǎn)單了,回憶一下剛才說(shuō)的前序遍歷的方式,前序遍歷是先要左孩子,就后壓入左孩子,反之,將前序遍歷的邏輯改寫(xiě)為:彈出每個(gè)棧頂結(jié)點(diǎn)作為當(dāng)前結(jié)點(diǎn)并存儲(chǔ)到一個(gè)輔助棧中,如果當(dāng)前結(jié)點(diǎn)有左孩子就先壓入左孩子,如果有右孩子就后壓入右孩子,每次取棧頂彈出到輔助棧中。最后將得到的輔助棧中元素依次彈出得到的就是后序遍歷的結(jié)果。

代碼實(shí)現(xiàn):

public static void posOrderTraverse(Node head) {
    System.out.println("pos-order");
    if(head != null) {
      Stack<Node> stack1 = new Stack<>();
      Stack<Node> stack2 = new Stack<>();   // 輔助棧,存儲(chǔ) 根 -> 右 -> 左 的結(jié)果
      stack1.push(head);
      while(!stack1.isEmpty()) {
        head = stack1.pop();
        stack2.push(head);
        // 有左孩子就先壓入左孩子
        if(head.left != null)
          stack1.push(head.left);
        // 有右孩子就后壓入右孩子
        if(head.right != null)
          stack1.push(head.right);
      }
      // 逆序打印 根 -> 右 -> 左 的結(jié)果,就是后序遍歷的結(jié)果
      while(!stack2.isEmpty())
        System.out.print(stack2.pop().val + " ");
    }
  }

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • Java 堆內(nèi)存與棧內(nèi)存詳細(xì)介紹

    Java 堆內(nèi)存與棧內(nèi)存詳細(xì)介紹

    這篇文章主要介紹了Java 堆內(nèi)存與棧內(nèi)存詳細(xì)介紹的相關(guān)資料,這里對(duì)java 的堆內(nèi)存和棧內(nèi)存進(jìn)行了詳細(xì)的分析,需要的朋友可以參考下
    2016-11-11
  • 如何利用JAVA實(shí)現(xiàn)走迷宮程序

    如何利用JAVA實(shí)現(xiàn)走迷宮程序

    最近經(jīng)常在機(jī)房看同學(xué)在玩一個(gè)走迷宮的游戲,比較有趣,自己也用java實(shí)現(xiàn)了一個(gè),這篇文章主要給大家介紹了關(guān)于如何利用JAVA實(shí)現(xiàn)走迷宮程序的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    這篇文章主要介紹了SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • Java如何簡(jiǎn)單快速入門(mén)JWT(token生成與驗(yàn)證)

    Java如何簡(jiǎn)單快速入門(mén)JWT(token生成與驗(yàn)證)

    這篇文章主要給大家介紹了關(guān)于Java如何簡(jiǎn)單快速入門(mén)JWT(token生成與驗(yàn)證)的相關(guān)資料,JWT是一個(gè)加密的字符串,JWT傳輸?shù)男畔⒔?jīng)過(guò)了數(shù)字簽名,因此傳輸?shù)男畔⒖梢员或?yàn)證和信任,需要的朋友可以參考下
    2023-12-12
  • Java跨域問(wèn)題的幾種后端解決方式舉例詳解

    Java跨域問(wèn)題的幾種后端解決方式舉例詳解

    跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)施的安全限制,這篇文章主要給大家介紹了關(guān)于Java跨域問(wèn)題的幾種后端解決方式的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • java中的IO流

    java中的IO流

    這篇文章主要介紹了java中的IO流的相關(guān)資料,需要的朋友可以參考下文
    2021-08-08
  • Java的Struts框架簡(jiǎn)介與環(huán)境配置教程

    Java的Struts框架簡(jiǎn)介與環(huán)境配置教程

    這篇文章主要介紹了Java的Struts框架與其環(huán)境配置教程,Struts框架是Java注明的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • idea如何自定義代碼模板

    idea如何自定義代碼模板

    這篇文章主要介紹了idea如何自定義代碼模板問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 詳解如何使用SpringBoot封裝Excel生成器

    詳解如何使用SpringBoot封裝Excel生成器

    在軟件開(kāi)發(fā)過(guò)程中,經(jīng)常需要生成Excel文件來(lái)導(dǎo)出數(shù)據(jù)或者生成報(bào)表,為了簡(jiǎn)化開(kāi)發(fā)流程和提高代碼的可維護(hù)性,我們可以使用Spring Boot封裝Excel生成器,本文將介紹如何使用Spring Boot封裝Excel生成器,并提供一些示例代碼來(lái)說(shuō)明其用法和功能
    2023-06-06
  • Hadoop Combiner使用方法詳解

    Hadoop Combiner使用方法詳解

    這篇文章主要介紹了 Hadoop Combiner使用方法詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10

最新評(píng)論

商丘市| 九龙城区| 滦南县| 绥阳县| 云安县| 措美县| 澄迈县| 安福县| 徐汇区| 宽甸| 吴桥县| 五家渠市| 富宁县| 同心县| 肇东市| 五华县| 呼伦贝尔市| 石棉县| 定陶县| 元氏县| 九龙城区| 拜泉县| 阳东县| 苏尼特左旗| 始兴县| 华坪县| 乐昌市| 丰镇市| 边坝县| 远安县| 洛川县| 潮安县| 民和| 长阳| 嘉鱼县| 泾源县| 商水县| 桦甸市| 洱源县| 大石桥市| 洪雅县|