zoukankan      html  css  js  c++  java
  • JAVA递归、非递归遍历二叉树

    
    

    前序遍历:
    1.访问根节点
    2.前序遍历左子树
    3.前序遍历右子树

    
    

    中序遍历:
    1.中序遍历左子树
    2.访问根节点
    3.中序遍历右子树

    
    

    后序遍历:
    1.后序遍历左子树
    2.后序遍历右子树
    3.访问根节点
    ---------------------

    package design;
    
    import java.util.ArrayDeque;
    import java.util.Queue;
    import java.util.Stack;    
        
    public class BinTree {    
       char data;
       BinTree leftChild;
       BinTree rightChild;
       public BinTree(char c) {    
           data = c;    
       } 
       public static void preSearch(BinTree root){
           if(root !=null){
               System.out.print(root.data);
               preSearch(root.leftChild);
               preSearch(root.rightChild);
           }
       }
       public static void midSearch(BinTree root){
           if(root !=null){           
               midSearch(root.leftChild);
               System.out.print(root.data);
               midSearch(root.rightChild);
           }else{
               return;
           }
       }
       public static void postSearch(BinTree root){
           if(root !=null){           
               postSearch(root.leftChild);           
               postSearch(root.rightChild);
               System.out.print(root.data);
           }
       }
       // 先序遍历非递归 
       public static void preOrder(BinTree root){
           Stack<BinTree> s = new Stack<BinTree>();
           while(root !=null || !s.empty()){
               while(root!=null){
                   System.out.print(root.data);
                   s.push(root);
                   root = root.leftChild;
               }
               if(!s.empty()){
                   root = s.pop();
                   root = root.rightChild;
               }
           }
       }
       // 中序遍历非递归
       public static void midOrder(BinTree root){
           Stack<BinTree> s = new Stack<BinTree>();
           while(root!=null || !s.empty()){
               while(root!=null){
                   s.push(root);
                   root = root.leftChild;
               }
               if(!s.empty()){
                   root =s.pop();
                   System.out.print(root.data);
                   root = root.rightChild;
               }
           }
       }
       // 后序遍历非递归  
       public static void postOrder(BinTree root){
           Stack<BinTree> s = new Stack<BinTree>();
           Stack<Integer> s2 = new Stack<Integer>();
           Integer i = new Integer(1);
           while(root!=null || !s.empty()){
               while(root!=null){
                   s.push(root);
                   s2.push(new Integer(0));
                   root = root.leftChild;
               }
               while(!s.empty() && s2.peek().equals(i)){
                   s2.pop();
                   System.out.print(s.pop().data);
               }
               if(!s.empty()){
                   s2.pop();
                   s2.push(new Integer(1));
                   root =s.peek();
                   root = root.rightChild;
               }
           }
       }
       //计算二叉树的深度
       public static int level(BinTree root){
           if(root == null){
               return 0;
           }
           return level(root.leftChild)+1>level(root.rightChild)+1?level(root.leftChild)+1:level(root.rightChild)+1;
           
       }
       //层序遍历二叉树
       public static void levelTrav(BinTree root) {
            if (root == null)
                return;
            Queue<BinTree> q = new ArrayDeque<BinTree>();
            q.add(root);
            BinTree cur;
            while (!q.isEmpty()) {
                cur = q.peek();
                System.out.print(cur.data + " ");
                if (cur.leftChild != null)
                    q.add(cur.leftChild);
                if (cur.rightChild != null)
                    q.add(cur.rightChild);
                q.poll();
            }
        }
       public static void main(String[] args) {    
           BinTree b1 = new BinTree('a');    
           BinTree b2 = new BinTree('b');    
           BinTree b3 = new BinTree('c');    
           BinTree b4 = new BinTree('d');    
           BinTree b5 = new BinTree('e');    
       
           /**  
            *      a   
            *     /  
            *    b   c  
            *   /  
            *  d   e  
            */    
           b1.leftChild = b2;    
           b1.rightChild = b3;    
           b2.leftChild = b4;    
           b2.rightChild = b5;    
       
           BinTree.preSearch(b1);    
           System.out.println();    
           BinTree.preOrder(b1);    
           System.out.println("========================");    
           BinTree.midSearch(b1);    
           System.out.println("");    
           BinTree.midOrder(b1);    
           System.out.println("========================");    
           BinTree.postSearch(b1);    
           System.out.println();    
           BinTree.postOrder(b1);
           System.out.println("========================"); 
           System.out.println(BinTree.level(b1));
           System.out.println("========================"); 
           BinTree.levelTrav(b1);
       }
    }
  • 相关阅读:
    kmp学习笔记(模板)
    最小表示法 (模板)
    Codeforces 1339C
    Codeforces 1339D
    Codeforces 1244C
    Codeforces 1262D2
    Codeforces 1330D
    Problem M. Mediocre String Problem
    Codeforces 1326D2
    selenium读取数据文件
  • 原文地址:https://www.cnblogs.com/zhou-test/p/9915453.html
Copyright © 2011-2022 走看看