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);
   }
}

 

转载于:https://www.cnblogs.com/zhou-test/p/9915453.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java二叉树非递归遍历可以通过使用栈数据结构来实现。首先,我们创建一个空的栈,将根节点入栈。然后,我们进入一个循环,直到栈为空为止。在每一次循环中,我们弹出栈顶元素,并将其访问。接下来,如果该节点有右子节点,则将右子节点入栈。如果该节点有左子节点,则将左子节点入栈。由于栈是先进后出的数据结构,所以我们先入栈右子节点,再入栈左子节点,以确保在遍历过程中先访问左子树节点。这样就能够实现二叉树非递归遍历。 以下是一个示例代码实现二叉树非递归中序遍历: ```java public void inorderTraversal(Node root) { if (root == null) { return; } Stack<Node> stack = new Stack<>(); Node current = root; while (current != null || !stack.isEmpty()) { while (current != null) { stack.push(current); current = current.leftChild; } current = stack.pop(); System.out.print(current.data + " "); // 访问节点 current = current.rightChild; } } ``` 在这个示例代码中,我们首先判断当前节点是否为空或者栈是否为空,如果不满足则进入循环。在循环内部,我们首先将当前节点及其所有左子节点入栈,直到当前节点为空。然后,我们弹出栈顶节点并访问该节点。最后,将当前节点更新为其右子节点,并继续下一次循环。 通过这种方式,我们可以实现二叉树非递归中序遍历。你可以根据需要修改代码实现其他类型的非递归遍历,比如前序遍历和后序遍历。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [用Python实现二叉树二叉树非递归遍历及绘制的例子](https://download.csdn.net/download/weixin_38618784/14869891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [java实现二叉树树的非递归遍历](https://blog.csdn.net/weixin_41826973/article/details/105555647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值