zoukankan      html  css  js  c++  java
  • 二叉树的前序、中序、后序、层序遍历方法

      1 package BinaryTreeDemo01;
      2 
      3 /*
      4  * 二叉树的前、中、后、层序遍历方法;
      5  * 其中前中后三种遍历方法类似,只是代码的顺序不同;
      6  * 层序遍历则使用队列实现;
      7  * */
      8 
      9 import java.util.LinkedList;
     10 import java.util.Queue;
     11 
     12 class BinaryTree01{
     13     class Node{
     14         private int data;
     15         private Node left;
     16         private Node right;
     17         public Node(int data){
     18             this.data = data;
     19         }
     20         public void addNode(Node newNode){
     21             if(this.data > newNode.data){
     22                 if(this.left == null){
     23                     this.left = newNode;
     24                 }else{
     25                     this.left.addNode(newNode);
     26                 }
     27             }
     28             if(this.data <= newNode.data){
     29                 if(this.right == null){
     30                     this.right = newNode;
     31                 }else{
     32                     this.right.addNode(newNode);
     33                 }
     34             }
     35         }
     36         
     37         public void preTravel(){            //前序遍历
     38             System.out.println(this.data);    //输出根节点数据,此处的根节点包括指子树的根节点
     39             if(this.left != null){
     40                 this.left.preTravel();        //左子树递归
     41             }
     42             if(this.right != null){            //右子树递归
     43                 this.right.preTravel();
     44             }
     45         }
     46         public void midTravel(){            //中序遍历
     47             if(this.left != null){            
     48                 this.left.midTravel();        //左子树递归
     49             }
     50             System.out.println(this.data);    //输出根节点数据,此处的根节点包括指子树的根节点
     51             if(this.right != null){
     52                 this.right.midTravel();        //右子树递归
     53             }
     54         }
     55         public void lastTravel(){            //后序遍历,其过程和前两种遍历方法类似,只是访问根节点的时间不同
     56             if(this.left != null){
     57                 this.left.lastTravel();
     58             }
     59             if(this.right != null){
     60                 this.right.lastTravel();
     61             }
     62             System.out.println(this.data);
     63         }    
     64     }
     65     Node root;
     66     public void add(int data){
     67         Node newNode = new Node(data);
     68         if(this.root == null){
     69             this.root = newNode;
     70         }else{
     71             this.root.addNode(newNode);
     72         }
     73     }
     74     public void prePrint(){
     75         this.root.preTravel();
     76     }
     77     public void midPrint(){
     78         this.root.midTravel();
     79     }
     80     public void lastPrint(){
     81         this.root.lastTravel();
     82     }
     83     
     84     
     85     /*
     86      * 层序遍历的思想不同于上边三种遍历;
     87      * 运用队列实现;先将根节点入队列,只要队列不为空,就出队列,并访问(打印或者加入数组、集合),
     88      * 接着将访问节点的左右子树依次入队列
     89      * */
     90     public void levelPrint(){
     91         levelTravel(this.root);
     92     }
     93     public void levelTravel(Node root){
     94         if(root == null) return;
     95         Queue<Node> q=new LinkedList<Node>();    //运用队列实现层序遍历
     96         q.add(root);
     97         while(!q.isEmpty()){
     98             Node temp =  q.poll();
     99             System.out.println(temp.data);
    100             if(temp.left!=null)q.add(temp.left); 
    101             if(temp.right!=null)q.add(temp.right);
    102         }
    103     }
    104 } 
    105 public class BinaryTravel01 {
    106 
    107     public static void main(String[] args) {
    108         BinaryTree01 b = new BinaryTree01();
    109         b.add(8);
    110         b.add(3);
    111         b.add(10);
    112         b.add(9);
    113         b.add(1);
    114         b.add(5);
    115         System.out.println("前序遍历:");
    116         b.prePrint();
    117         System.out.println("中序遍历:");
    118         b.midPrint();
    119         System.out.println("后序遍历:");
    120         b.lastPrint();
    121         System.out.println("层序遍历:");
    122         b.levelPrint();
    123     }
    124 }
  • 相关阅读:
    方向-Vocabulary
    常见问题之Zego+Audio原生播放音频冲突
    synchronized类锁,方法锁,块级锁,一文看懂
    vim复制粘贴
    FastDFS文件服务器安装指南附安装包和自启动(看此篇就够了)
    springboot后端校验
    springboot打包启动时报mybatis的typeAlias类名找不到的错误
    给springboot增加XSS跨站脚本攻击防护功能
    docker cannot open directory .: Permission denied无权限问题
    docker学习笔记一篇就通系列(持续更新)
  • 原文地址:https://www.cnblogs.com/XuGuobao/p/7425178.html
Copyright © 2011-2022 走看看