1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網營銷解決方案
      Java語言實現(xiàn)非遞歸實現(xiàn)樹的前中后序遍歷總結

      前言

      成都創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網技術服務公司,擁有項目做網站、網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元祿勸做網站,已為上家服務,為祿勸各地企業(yè)和個人服務,聯(lián)系電話:18982081108

      三種遍歷的遞歸寫法都很好寫,所以總結一下非遞歸寫法。

      先貼一張圖復習一下三種遍歷方式就進入正文啦~

      Java語言實現(xiàn)非遞歸實現(xiàn)樹的前中后序遍歷總結

      【注:本文所有代碼實現(xiàn)中樹的結點定義如下:

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

      1.前序遍歷

      實現(xiàn)思路:

      前序遍歷的順序是:根結點 -> 左孩子 -> 右孩子

      借助一個棧結構先將根結點壓入棧,然后循環(huán)每次取出棧頂元素,直到棧為空。如果當前結點有右孩子就先將右孩子壓入棧中,如果當前結點有左孩子就將左孩子壓入棧中,這里注意順序,因為棧的結構是先進后出的,為了保證先遍歷到左孩子就應該后壓左孩子~

      代碼實現(xiàn):

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

      public void preOrder(Node head) {
          System.out.println("pre-order:");
          if(head != null) {
            Stack 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.中序遍歷

      實現(xiàn)思路:

      中序遍歷的順序:左孩子 -> 根結點 -> 右孩子

      借助棧結構,將當前結點的左孩子依次入棧直到沒有左孩子了就彈出棧頂元素并打印,如果彈出的結點有右孩子就將右孩子的左邊界依次入棧,循環(huán)…

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

      代碼實現(xiàn):

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

      3.后序遍歷

      實現(xiàn)思路:

      后序遍歷的順序:左孩子 -> 右孩子 -> 根結點

      仔細想一下,打印每個結點需要訪問根結點三次,先從根結點開始找到左孩子,返回再找到右孩子,再返回到根結點,需要訪問根結點三次,直接按照當前順序進行遍歷不知如何下手,那么我們可以換一個角度去考慮。

      棧結構是先進后出的,那我們不妨借助一個棧先存儲 根結點 -> 右孩子 -> 左孩子 的結果,再將其依次彈出就是后序遍歷的順序了。

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

      代碼實現(xiàn):

      public static void posOrderTraverse(Node head) {
          System.out.println("pos-order");
          if(head != null) {
            Stack stack1 = new Stack<>();
            Stack stack2 = new Stack<>();   // 輔助棧,存儲 根 -> 右 -> 左 的結果
            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);
            }
            // 逆序打印 根 -> 右 -> 左 的結果,就是后序遍歷的結果
            while(!stack2.isEmpty())
              System.out.print(stack2.pop().val + " ");
          }
        }

      總結

      以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對創(chuàng)新互聯(lián)的支持。如果你想了解更多相關內容請查看下面相關鏈接


      網頁標題:Java語言實現(xiàn)非遞歸實現(xiàn)樹的前中后序遍歷總結
      鏈接地址:http://ef60e0e.cn/article/piooec.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        华坪县| 阿图什市| 绥芬河市| 鄂尔多斯市| 靖远县| 区。| 奉新县| 乐清市| 新安县| 东海县| 弥勒县| 安吉县| 阳朔县| 砚山县| 双江| 仙游县| 武邑县| 嘉定区| 汉源县| 安溪县| 安西县| 寿阳县| 滦南县| 彰化县| 扎鲁特旗| 武定县| 鄂伦春自治旗| 高雄市| 南皮县| 理塘县| 上犹县| 琼中| 桂林市| 临沭县| 锡林郭勒盟| 酒泉市| 南皮县| 莎车县| 双辽市| 北海市| 清苑县|