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
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
      Java完全二叉樹(shù)的創(chuàng)建與四種遍歷方法分析

      本文實(shí)例講述了Java完全二叉樹(shù)的創(chuàng)建與四種遍歷方法。分享給大家供大家參考,具體如下:

      成都創(chuàng)新互聯(lián)公司2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元洪山做網(wǎng)站,已為上家服務(wù),為洪山各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

      有如下的一顆完全二叉樹(shù):

      Java完全二叉樹(shù)的創(chuàng)建與四種遍歷方法分析

      先序遍歷結(jié)果應(yīng)該為:1  2  4  5  3  6  7
      中序遍歷結(jié)果應(yīng)該為:4  2  5  1  6  3  7
      后序遍歷結(jié)果應(yīng)該為:4  5  2  6  7  3  1
      層序遍歷結(jié)果應(yīng)該為:1  2  3  4  5  6  7

      二叉樹(shù)的先序遍歷、中序遍歷、后序遍歷其實(shí)都是一樣的,都是執(zhí)行遞歸操作。

      我這記錄一下層次遍歷吧:層次遍歷需要用到隊(duì)列,先入隊(duì)在出隊(duì),每次出隊(duì)的元素檢查是其是否有左右孩子,有則將其加入隊(duì)列,由于利用隊(duì)列的先進(jìn)先出原理,進(jìn)行層次遍歷。

      下面記錄下完整代碼(java實(shí)現(xiàn)),包括幾種遍歷方法:

      import java.util.ArrayDeque;
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Queue;
      /**
       * 定義二叉樹(shù)節(jié)點(diǎn)元素
       * @author bubble
       *
       */
      class Node {
        public Node leftchild;
        public Node rightchild;
        public int data;
        public Node(int data) {
          this.data = data;
        }
      }
      public class TestBinTree {
        /**
         * 將一個(gè)arry數(shù)組構(gòu)建成一個(gè)完全二叉樹(shù)
         * @param arr 需要構(gòu)建的數(shù)組
         * @return 二叉樹(shù)的根節(jié)點(diǎn)
         */
        public Node initBinTree(int[] arr) {
          if(arr.length == 1) {
            return new Node(arr[0]);
          }
          List nodeList = new ArrayList<>();
          for(int i = 0; i < arr.length; i++) {
            nodeList.add(new Node(arr[i]));
          }
          int temp = 0;
          while(temp <= (arr.length - 2) / 2) { //注意這里,數(shù)組的下標(biāo)是從零開(kāi)始的
            if(2 * temp + 1 < arr.length)
              nodeList.get(temp).leftchild = nodeList.get(2 * temp + 1);
            if(2 * temp + 2 < arr.length)
              nodeList.get(temp).rightchild = nodeList.get(2 * temp + 2);
            temp++;
          }
          return nodeList.get(0);
          }
        /**
         * 層序遍歷二叉樹(shù)
         * @param root 二叉樹(shù)根節(jié)點(diǎn)
         * @param nodeQueue ,用到的隊(duì)列數(shù)據(jù)結(jié)構(gòu)
         */
         public void trivalBinTree(Node root, Queue nodeQueue) {
          nodeQueue.add(root);
          Node temp = null;
          while ((temp = nodeQueue.poll()) != null) {
            System.out.print(temp.data + " ");
            if (temp.leftchild != null) {
              nodeQueue.add(temp.leftchild);
            }
            if (temp.rightchild != null) {
              nodeQueue.add(temp.rightchild);
            }
          }
        }
         /**
          * 先序遍歷
          * @param root 二叉樹(shù)根節(jié)點(diǎn)
          */
          public void preTrival(Node root) {
            if(root == null) {
              return;
            }
            System.out.print(root.data + " ");
            preTrival(root.leftchild);
            preTrival(root.rightchild);
          }
          /**
           * 中序遍歷
           * @param root 二叉樹(shù)根節(jié)點(diǎn)
           */
          public void midTrival(Node root) {
            if(root == null) {
              return;
            }
            midTrival(root.leftchild);
            System.out.print(root.data + " ");
            midTrival(root.rightchild);
          }
          /**
           * 后序遍歷
           * @param root 二叉樹(shù)根節(jié)點(diǎn)
           */
          public void afterTrival(Node root) {
            if(root == null) {
              return;
            }
            afterTrival(root.leftchild);
            afterTrival(root.rightchild);
            System.out.print(root.data + " ");
          }
          public static void main(String[] args) {
            TestBinTree btree = new TestBinTree();
            int[] arr = new int[] {1,2,3,4,5,6,7};
            Node root = btree.initBinTree(arr);
            Queue nodeQueue = new ArrayDeque<>();
            System.out.println("創(chuàng)新互聯(lián)測(cè)試結(jié)果:");
            System.out.println("層序遍歷:");
            btree.trivalBinTree(root, nodeQueue);
            System.out.println("\n先序遍歷:");
            btree.preTrival(root);
            System.out.println("\n中序遍歷:");
            btree.midTrival(root);
            System.out.println("\n后序遍歷:");
            btree.afterTrival(root);
          }
      }
      
      

      運(yùn)行結(jié)果:

      Java完全二叉樹(shù)的創(chuàng)建與四種遍歷方法分析

      附:滿二叉樹(shù) 與完全二叉樹(shù)的區(qū)別

      滿二叉樹(shù)是指這樣的一種二叉樹(shù):除最后一層外,每一層上的所有結(jié)點(diǎn)都有兩個(gè)子結(jié)點(diǎn)。在滿二叉樹(shù)中,每一層上的結(jié)點(diǎn)數(shù)都達(dá)到最大值,即在滿二叉樹(shù)的第k層上有2k-1個(gè)結(jié)點(diǎn),且深度為m的滿二叉樹(shù)有2m-1個(gè)結(jié)點(diǎn)。

      完全二叉樹(shù)是指這樣的二叉樹(shù):除最后一層外,每一層上的結(jié)點(diǎn)數(shù)均達(dá)到最大值;在最后一層上只缺少右邊的若干結(jié)點(diǎn)。

      對(duì)于完全二叉樹(shù)來(lái)說(shuō),葉子結(jié)點(diǎn)只可能在層次最大的兩層上出現(xiàn):對(duì)于任何一個(gè)結(jié)點(diǎn),若其右分支下的子孫結(jié)點(diǎn)的最大層次為p,則其左分支下的子孫結(jié)點(diǎn)的最大層次或?yàn)閜,或?yàn)閜+1。

      完全二叉樹(shù)具有以下兩個(gè)性質(zhì):

      性質(zhì)5:具有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的深度為[log2n]+1。

      性質(zhì)6:設(shè)完全二叉樹(shù)共有n個(gè)結(jié)點(diǎn)。如果從根結(jié)點(diǎn)開(kāi)始,按層次(每一層從左到右)用自然數(shù)1,2,……,n給結(jié)點(diǎn)進(jìn)行編號(hào),則對(duì)于編號(hào)為k(k=1,2,……,n)的結(jié)點(diǎn)有以下結(jié)論:

      ①若k=1,則該結(jié)點(diǎn)為根結(jié)點(diǎn),它沒(méi)有父結(jié)點(diǎn);若k>1,則該結(jié)點(diǎn)的父結(jié)點(diǎn)編號(hào)為INT(k/2)。

      ②若2k≤n,則編號(hào)為k的結(jié)點(diǎn)的左子結(jié)點(diǎn)編號(hào)為2k;否則該結(jié)點(diǎn)無(wú)左子結(jié)點(diǎn)(顯然也沒(méi)有右子結(jié)點(diǎn))。

      ③若2k+1≤n,則編號(hào)為k的結(jié)點(diǎn)的右子結(jié)點(diǎn)編號(hào)為2k+1;否則該結(jié)點(diǎn)無(wú)右子結(jié)點(diǎn)。

      滿二叉樹(shù)肯定是完全二叉樹(shù),完全二叉樹(shù)不一定是滿二叉樹(shù)。

      更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

      希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。


      本文名稱:Java完全二叉樹(shù)的創(chuàng)建與四種遍歷方法分析
      本文路徑:http://www.ef60e0e.cn/article/jhdooc.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>

        马鞍山市| 高台县| 汽车| 苏尼特右旗| 剑川县| 旅游| 城口县| 新野县| 临泽县| 元江| 沛县| 吉木萨尔县| 通城县| 芒康县| 调兵山市| 稻城县| 牟定县| 调兵山市| 海淀区| 西宁市| 东丽区| 林州市| 扶余县| 永济市| 沙湾县| 得荣县| 陵川县| 湄潭县| 桦甸市| 克东县| 天门市| 怀集县| 通榆县| 卓资县| 大石桥市| 凌云县| 会东县| 石台县| 中超| 中牟县| 温泉县|