(java)二叉树的前中后序遍历

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;


public class 二叉树的前中后遍历 {
    //建立二叉树结构
    private static class Node {  
        Node leftChild;  
        Node rightChild;  
        int data;
        Node(int data) {  
            leftChild = null;  
            rightChild = null;  
            this.data = data;  
        }  
    }
    /**
     * 创建完全二叉树方法
     * @param bNode 节点对象
     * @param x    数的深度
     */
    public static void createBinTree(Node node,int x,int k) {  
          if(x==1)
              return;
          node.leftChild=new Node(k*2);
          node.rightChild=new Node(k*2+1);
          createBinTree(node.leftChild,x-1,k*2);
          createBinTree(node.rightChild,x-1,k*2+1);
    }  
    /** 
     * 先序遍历 
     *  
     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 
     *  
     * @param node 
     *            遍历的节点 
     */  
    public static void preOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        System.out.print(node.data + " ");  
        preOrderTraverse(node.leftChild);  
        preOrderTraverse(node.rightChild);  
    }  
  
    /** 
     * 中序遍历 
     *  
     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 
     *  
     * @param node 
     *            遍历的节点 
     */  
    public static void inOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        inOrderTraverse(node.leftChild);  
        System.out.print(node.data + " ");  
        inOrderTraverse(node.rightChild);  
    }  
  
    /** 
     * 后序遍历 
     *  
     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 
     *  
     * @param node 
     *            遍历的节点 
     */  
    public static void postOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        postOrderTraverse(node.leftChild);  
        postOrderTraverse(node.rightChild);  
        System.out.print(node.data + " ");  
    }  
    /**
     * 广度优先算法
     * @param args
     */
    public static void length(Node root) {
        if(root==null)
            return;
        //队列存储节点,每次进来节点,先扫描其子节点进队列,再本身出队列
        Queue<Node> queue=new LinkedList<Node>();
        //进队列,offer在队满时不会报满溢出,只会返回false;
        queue.offer(root);
        while(!queue.isEmpty()){
            //poll移除并返回首部
            Node tree=queue.poll();
            if(tree.leftChild!=null)
                queue.offer(tree.leftChild);
            if(tree.rightChild!=null)
                queue.offer(tree.rightChild);
            System.out.print(tree.data+" ");
        }
        return ;
    }
    /**
     * 深度优先算法,非递归
     * @param args
     */
    public static void deep(Node root) {
        Stack<Node> stack=new Stack<Node>();
        stack.push(root);
        while(!stack.isEmpty()){
            Node tree=stack.pop();
            //先往栈中压入右节点,再压左节点,这样出栈就是先左节点后右节点了。
            if(tree.rightChild!=null)
                stack.push(tree.rightChild);
            if(tree.leftChild!=null)
                stack.push(tree.leftChild);
            System.out.print(tree.data+" ");
        }
        return ;
    }
    public static void main(String[] args) {  
        //建立头节点 
        Node node=new Node(-1);
        createBinTree(node,3,1);  
   
        System.out.println("先序遍历:");  
        preOrderTraverse(node);  
        System.out.println();  
  
        System.out.println("中序遍历:");  
        inOrderTraverse(node);  
        System.out.println();  
  
        System.out.println("后序遍历:");  
        postOrderTraverse(node); 
        System.out.println();
        
        System.out.println("广度优先遍历:");  
        length(node); 
        System.out.println();
        
        System.out.println("深度优先遍历非递归:");  
        deep(node); 
        System.out.println();
    }  
  
} 

 

    
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值