JAVA实现二叉树的遍历

首先简单的构造一个二叉树,然后通过前序、中序、后序遍历的递归和非递归形式遍历,同时也实现了层次遍历。

package sxd.learn.java;

import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.LinkedBlockingQueue;

public class BinaryTree<T> {

    public static void main(String[] args){
        BinaryTree<Integer> binaryTree = new BinaryTree(1);
        binaryTree.createBinaryTree();

        System.out.println("前序遍历");
        binaryTree.preOrderTraverse();
        System.out.println();
        binaryTree.nrPeOrderTraverse();
        System.out.println();

        System.out.println("中序遍历");
        binaryTree.inOrderTraverse();
        System.out.println();
        binaryTree.nrInOrderTraverse();
        System.out.println();

        System.out.println("后序遍历");
        binaryTree.postOrderTraverse();
        System.out.println();
        binaryTree.nrPostOrderTraverse();
        System.out.println();

        System.out.println("层次遍历");
        binaryTree.levelTraverse();
        System.out.println();
    }

    private Node<T> root;

    public BinaryTree(T value){
        root = new Node<T>(value);
    }

    //简单构造二叉树
    public  void createBinaryTree(){
        Node node2 = new Node<Integer>(2);
        Node node3 = new Node<Integer>(3);
        Node node4 = new Node<Integer>(4);
        Node node5 = new Node<Integer>(5);
        Node node6 = new Node<Integer>(6);

        root.leftChild = node2;
        root.rightChild = node3;
        node2.leftChild = node4;
        node2.rightChild = node5;
        node3.leftChild = node6;
    }

    public boolean isEmpty(){
        return root == null;
    }

    //前序遍历的递归实现
    public void preOrderTraverse(){
        preOrderTraverse(root);
    }
    public void preOrderTraverse(Node<T> root){
        if(root != null){
            System.out.print(root.value + " ");
            preOrderTraverse(root.leftChild);
            preOrderTraverse(root.rightChild);
        }
    }

    //前序遍历的非递归实现
    public void nrPeOrderTraverse(){
        Stack<Node<T>> stack = new Stack<>();
        Node<T> node = root;
        while(node != null || !stack.isEmpty()){
            while(node != null){
                System.out.print(node.value + " ");
                stack.push(node);
                node = node.leftChild;
            }
            node = stack.pop();
            node = node.rightChild;
        }
    }

    //中序遍历的递归实现
    public void inOrderTraverse(){
        inOrderTraverse(root);
    }
    public void inOrderTraverse(Node<T> root){
        if(root != null){
            inOrderTraverse(root.leftChild);
            System.out.print(root.value + " ");
            inOrderTraverse(root.rightChild);
        }
    }

    //中序遍历的非递归实现
    public void nrInOrderTraverse(){
        Stack<Node<T>> stack = new Stack<>();
        Node<T> node = root;
        while(node != null || !stack.isEmpty()){
            while(node != null){
                stack.push(node);
                node = node.leftChild;
            }
            node = stack.pop();
            System.out.print(node.value+ " ");
            node = node.rightChild;
        }
    }

    //后序遍历的递归实现
    public void postOrderTraverse(){
        postOrderTraverse(root);
    }
    public void postOrderTraverse(Node<T> root){
        if(root != null){
            postOrderTraverse(root.leftChild);
            postOrderTraverse(root.rightChild);
            System.out.print(root.value + " ");
        }
    }

    //后序遍历的非递归实现
    public void nrPostOrderTraverse(){
        Stack<Node<T>> stack = new Stack<>();
        Node<T> node = root;
        Node<T> preNode = null;
        while(node != null || !stack.isEmpty()){
            while(node != null){
                stack.push(node);
                node = node.leftChild;
            }

            node = stack.peek();
            if(node.rightChild == null || node.rightChild == preNode){
                System.out.print(node.value + " ");
                node = stack.pop();
                preNode = node;
                node = null;
            }else{
                node = node.rightChild;
            }
        }
    }

    public void levelTraverse(){
        Queue<Node<T>> queue = new LinkedBlockingQueue<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            Node<T> temp = queue.poll(); 
            if(temp != null){
                 System.out.print(temp.value +  " ");
                 if(temp.leftChild != null)
                     queue.offer(temp.leftChild);
                 if(temp.rightChild != null)
                     queue.offer(temp.rightChild);
            }
        }
    }

    class Node<T>{
        T value;
        Node<T> leftChild;
        Node<T> rightChild;
        Node(T value){
            this.value = value;
            leftChild = null;
            rightChild = null;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值