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

JAVA二叉樹(shù)的幾種遍歷(遞歸,非遞歸)實(shí)現(xiàn)

 更新時(shí)間:2020年12月04日 18:53:11   作者:果凍愛(ài)吃小黃人  
這篇文章主要介紹了JAVA二叉樹(shù)的幾種遍歷(遞歸,非遞歸)實(shí)現(xiàn),需要的朋友可以參考下

首先二叉樹(shù)是樹(shù)形結(jié)構(gòu)的一種特殊類型,它符合樹(shù)形結(jié)構(gòu)的所有特點(diǎn)。本篇博客會(huì)針對(duì)二叉樹(shù)來(lái)介紹一些樹(shù)的基本概念,二叉樹(shù)的基本操作(存儲(chǔ),返回樹(shù)的深度,節(jié)點(diǎn)個(gè)數(shù),每一層的節(jié)點(diǎn)個(gè)數(shù)),二叉樹(shù)的四種遍歷(層次,先序,中序,后序)

一.基本概念

二叉樹(shù)有5種基本形態(tài):

基本形態(tài)

注:二叉樹(shù)有序樹(shù),就是說(shuō)一個(gè)節(jié)點(diǎn)的左右節(jié)點(diǎn)是有大小之分的,我們通常設(shè)定為左孩子一定大于右孩子,下面的實(shí)現(xiàn)都是基于這個(gè)規(guī)則的。二叉樹(shù)分為三種:滿二叉樹(shù),完全二叉樹(shù),不完全二叉樹(shù)

這里寫(xiě)圖片描述

二叉樹(shù)的四種遍歷:層次,先序,中序,后序首先是非遞歸實(shí)現(xiàn)上圖的滿二叉樹(shù):1.先序:根左右,用棧來(lái)實(shí)現(xiàn),下面是它的流程圖和入棧出棧的狀態(tài)圖(n是每個(gè)節(jié)點(diǎn)的值) 輸出:12,10,9,11,15,14,16

這里寫(xiě)圖片描述
這里寫(xiě)圖片描述

2.中序:左根右,用棧來(lái)實(shí)現(xiàn),中序的堆棧狀態(tài)和先序一樣,只是輸出的位置不同,先序在入棧前輸出,中序在出棧后輸出 輸出:9,10,11,12,14,15,16

這里寫(xiě)圖片描述

3.后序:左右根,采用了兩個(gè)棧 輸出:9,11,10,14,16,15,12

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

下面是實(shí)現(xiàn)的代碼:

//創(chuàng)建一個(gè)節(jié)點(diǎn)類
 class Node {
  public int key;//節(jié)點(diǎn)的值
  public String Data;//節(jié)點(diǎn)存儲(chǔ)的內(nèi)容
  public Node leftNode;//左孩子
  public Node rightNode;//右孩子

  //節(jié)點(diǎn)類的構(gòu)造方法
  public Node(int key,String Data){
    this.key=key;
    this.Data=Data;
    this.leftNode=null;
    this.rightNode=null;
  }

  //得到數(shù)據(jù)
  public int getKey(){
    return key;

}

}
public class BinaryTree {
  public Node root;
  public int h=0;

  //插入數(shù)據(jù)
  public void insert(int key,String Data){
    //實(shí)例化一個(gè)節(jié)點(diǎn)
    Node newNode=new Node(key, Data);
    //判斷此二叉樹(shù)是否有根節(jié)點(diǎn)
    if(root==null){
      root=newNode;

    }
    else
    {
      Node current=root;
      Node parent;
      while(true){
        parent=current;
        //判斷大小,決定新節(jié)點(diǎn)是放在左邊還是右邊
        if(key<current.key){
          current=current.leftNode;//往左子樹(shù)方向找
          if(current==null){
            parent.leftNode=newNode;//找到葉子節(jié)點(diǎn)
            return;
          }//葉子節(jié)點(diǎn)的If end;
        }//左子樹(shù)的If end;
        else{
          current=current.rightNode;
          if(current==null){
            parent.rightNode=newNode;
            return;
          }//葉子
        }//右子樹(shù)

      }
    }
  }//insert end;

//打印
  public void printlTree(Node node){
    System.out.print("*");

    System.out.print(node.getKey());


  }




  //深度
  public int Height(Node node){
    if(node==null){
      return 0;
    }
    else{
      int i=Height(node.leftNode);
      int j=Height(node.rightNode);
      return (i>j)?(i+1):(j+1);

    }
  }

  //節(jié)點(diǎn)個(gè)數(shù)
  public int NodeNum(Node node){
    if(node==null){
      return 0;
    }
    return NodeNum(node.leftNode)+NodeNum(node.rightNode)+1;

  }

  //第K層節(jié)點(diǎn)的個(gè)數(shù)
  public int getLeafNodeNum(Node node,int i){
    if(node==null){
      return 0;
    }
    else{
      if(i==0){
        return 1;
      }
      else{
        int numLeft=getLeafNodeNum(node.leftNode,i-1);
        int numRight=getLeafNodeNum(node.rightNode,i-1);
        return (numLeft+numRight);
      }
    }
    }



  //分層遍歷
  public void LevelOrder(Node node){
    Queue<Node> queue=new LinkedList<Node>();
    if(node==null){
      return;
    }
    queue.add(node);
    while(!queue.isEmpty()){
      Node temp=queue.poll();
      System.out.print("*");
      System.out.print(temp.getKey());
      if(temp.leftNode!=null){
        queue.add(temp.leftNode);
      }
      if(temp.rightNode!=null){
        queue.add(temp.rightNode);
      }
    }
  }

  //遞歸前序遍歷
  public void preOrder(Node node){
    if(node!=null){
    printlTree(node);
    preOrder(node.leftNode);
    preOrder(node.rightNode);
  }
  }
  //非遞歸前序遍歷
  public void NpreOrder(Node node){

    Stack<Node> sk=new Stack<Node>();
    Node n=node;
    while(!sk.isEmpty()||n!=null){
      if(n!=null){
      System.out.print("<<<");
      System.out.print(n.getKey());

      sk.push(n);
      n=n.leftNode;
      }

      else{
      n=sk.pop();;
      n=n.rightNode;
    }
  }
  }


  //中序遍歷
    public void inOrder(Node node){
      if(node!=null){
      preOrder(node.leftNode);
      printlTree(node);

      preOrder(node.rightNode);
    }
    }

    //非遞歸的中序遍歷
    public void NinOrder(Node node){
      Stack<Node> s=new Stack<Node>();
      Node n=node;
      while(n!=null||!s.isEmpty()){
        if(n!=null){
          s.push(n);
          n=n.leftNode;
        }
        else{
          n=s.pop();
          System.out.println(n.getKey());
          n=n.rightNode;

        }
      }
    }

    //后序遍歷
        public void postOrder(Node node){
          if(node!=null){
          preOrder(node.leftNode);

          preOrder(node.rightNode);
          printlTree(node);

        }
        }

        //非遞歸后序遍歷
        public void NpostOrder(Node node){
          Stack<Node> s1=new Stack<Node>();//第一次入棧
          Stack<Node> s2=new Stack<Node>();//第二次入棧
          Node n=node;
        while(!s1.isEmpty()||n!=null){
          if(n!=null){
            s1.push(n);
            s2.push(n);
            n=n.rightNode;
          }
          else{
            n=s1.pop();
            n=n.leftNode;
          }
        }
        while(!s2.isEmpty()){
          System.out.println("((("+s2.pop().getKey());
        }

        }

public static void main(String[] args) {

    BinaryTree bt=new BinaryTree();
    bt.insert(12, "A");
    bt.insert(10, "B");
    bt.insert(15, "C");
    bt.insert(9, "D");
    bt.insert(11, "E");
    bt.insert(14, "F");
    bt.insert(16, "G");

   System.out.println("這個(gè)二叉樹(shù)的深度:"+bt.Height(bt.root));
    System.out.println("這個(gè)二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù):"+bt.NodeNum(bt.root));


    System.out.println("前序遍歷:");
    bt.preOrder(bt.root);
    System.out.println();

    System.out.println("非遞歸前序遍歷:");
    bt.NpreOrder(bt.root);
    System.out.println();

    System.out.println("中序遍歷:");
    bt.inOrder(bt.root);
    System.out.println();

    System.out.println("非遞歸中序遍歷:");
    bt.NinOrder(bt.root);
    System.out.println();

    System.out.println("后序遍歷:");
    bt.postOrder(bt.root);
    System.out.println();

    System.out.println("非遞歸后序遍歷:");
    bt.NpostOrder(bt.root);
    System.out.println();

    System.out.println("分層遍歷:");
    bt.LevelOrder(bt.root);
    System.out.println();

    System.out.println("第二層有"+bt.getLeafNodeNum(bt.root, 2));

  }
    }

代碼親測(cè)可以運(yùn)行(^-^)V

這些只是二叉樹(shù)的一部分內(nèi)容,希望可以幫助一些初學(xué)數(shù)據(jù)結(jié)構(gòu)的親,如果有錯(cuò)誤的地方可以幫忙提出來(lái)的哦??!

相關(guān)文章

  • MyBatis中正則使用foreach拼接字符串

    MyBatis中正則使用foreach拼接字符串

    這篇文章主要介紹了MyBatis中正則使用foreach拼接字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 淺析SpringBoot2底層注解@Conditional@ImportResource

    淺析SpringBoot2底層注解@Conditional@ImportResource

    這篇文章主要為大家介紹了SpringBoot2底層注解@Conditional@ImportResource的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • java反射耗時(shí)測(cè)試案例解析

    java反射耗時(shí)測(cè)試案例解析

    這篇文章主要介紹了java反射耗時(shí)測(cè)試案例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Mybatis執(zhí)行update失敗的解決

    Mybatis執(zhí)行update失敗的解決

    這篇文章主要介紹了Mybatis執(zhí)行update失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java源碼刨析之ArrayQueue

    Java源碼刨析之ArrayQueue

    在本篇文章當(dāng)中主要給大家介紹一個(gè)比較簡(jiǎn)單的JDK為我們提供的容器ArrayQueue,這個(gè)容器主要是用數(shù)組實(shí)現(xiàn)的一個(gè)單向隊(duì)列,整體的結(jié)構(gòu)相對(duì)其他容器來(lái)說(shuō)就比較簡(jiǎn)單了
    2022-07-07
  • java解析sina視頻

    java解析sina視頻

    本文介紹了一個(gè)java解析sina視頻地址的例子,從這個(gè)例子中可以學(xué)習(xí)到j(luò)ava使用sax解析xml的方法,大家可以參考修改成其它功能
    2014-01-01
  • java通過(guò)證書(shū)訪問(wèn)etcd的實(shí)現(xiàn)步驟

    java通過(guò)證書(shū)訪問(wèn)etcd的實(shí)現(xiàn)步驟

    Etcd提供了多種語(yǔ)言的客戶端庫(kù),本文主要介紹了java通過(guò)證書(shū)訪問(wèn)etcd的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • JFreeChart簡(jiǎn)單實(shí)現(xiàn)光滑曲線繪制

    JFreeChart簡(jiǎn)單實(shí)現(xiàn)光滑曲線繪制

    這篇文章主要為大家詳細(xì)介紹了JFreeChart簡(jiǎn)單實(shí)現(xiàn)光滑曲線的繪制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 如何使用IDEA從SVN服務(wù)端檢出項(xiàng)目

    如何使用IDEA從SVN服務(wù)端檢出項(xiàng)目

    這篇文章主要介紹了如何使用IDEA從SVN服務(wù)端檢出項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot淺析安全管理之Shiro框架

    SpringBoot淺析安全管理之Shiro框架

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問(wèn)題,這篇文章主要介紹了SpringBoot安全管理Shiro框架的使用
    2022-08-08

最新評(píng)論

安达市| 江都市| 雅江县| 本溪| 棋牌| 三明市| 闽清县| 长宁区| 德化县| 垦利县| 古丈县| 高唐县| 鄱阳县| 新泰市| 介休市| 武功县| 郸城县| 河曲县| 昌都县| 新安县| 大连市| 大竹县| 滕州市| 阜新| 江永县| 苏尼特左旗| 九台市| 伊通| 原阳县| 台东县| 光泽县| 成安县| 寿宁县| 阳东县| 观塘区| 上杭县| 自贡市| 岫岩| 政和县| 东方市| 孟村|