java实现二叉树的创建及三种遍历方式

java实现二叉树的创建及三种遍历方式

接口定义

public interface Tree {

    /**
     * 二叉树的创建
     * @param arr
     * @return
     */
    public List<Node> createBinTree(int[] arr);

    /**
     * 前序遍历
     * @param node
     */
    public void preOrderTraverse(Node node);

    /**
     * 中序遍历
     * @param node
     */
    public void inorderTraversal(Node node);

    /**
     * 后序遍历
     * @param node
     */
    public void postorderTraversal(Node node);
}

树的节点类

public class Node {
    private int date;
    private Node leftChild;
    private Node rightChild;

    public Node(int newdate){
        this.date = newdate;
        leftChild = null;
        rightChild = null;
    }
 .......get and set方法   
 }

接口实现类

public class TreeImpl implements Tree {

    @Override
    public List<Node> createBinTree(int[] arr) {

        List<Node> nodeList = new LinkedList<>();
        //将所有数值转化为节点
        for (int nodeIndex = 0; nodeIndex < arr.length; nodeIndex++) {
            nodeList.add(new Node(arr[nodeIndex]));
        }
        //对lastParentIndex-1个节点建立二叉树关系
        for (int parentIndex = 0; parentIndex < arr.length / 2 - 1; parentIndex++) {
            //左孩子
            nodeList.get(parentIndex).setLeftChild(nodeList.get(parentIndex * 2 + 1));
            //右孩子
            nodeList.get(parentIndex).setRightChild(nodeList.get(parentIndex * 2 + 2));
        }
        //最后一个父节点,可能只有左孩子,拿出来单独处理
        int lastParentIndex = arr.length / 2 - 1;
        //左孩子
        nodeList.get(lastParentIndex).setLeftChild(nodeList.get(lastParentIndex * 2 + 1));
        //arr的长度为奇数时,建立右孩子
        if (arr.length % 2 == 1) {
            nodeList.get(lastParentIndex).setRightChild(nodeList.get(lastParentIndex * 2 + 2));
        }
        return nodeList;
    }

    @Override
    public void preOrderTraverse(Node node) {
        if (node == null) {
            return;
        }
        System.out.print(node.getDate() + "  ");
        preOrderTraverse(node.getLeftChild());
        preOrderTraverse(node.getRightChild());
    }

    @Override
    public void inorderTraversal(Node node){
        if (node == null){
            return;
        }
        inorderTraversal(node.getLeftChild());
        System.out.print(node.getDate() + "  ");
        inorderTraversal(node.getRightChild());
    }

    @Override
    public void postorderTraversal(Node node){
        if (node == null){
            return;
        }
        postorderTraversal(node.getLeftChild());
        postorderTraversal(node.getRightChild());
        System.out.print(node.getDate() + "  ");
    }
 }

测试类

public class Test {

    public static void main(String[] args){

        Tree tree = new TreeImpl();
        int[] arr = {1,2,3,4,5,6,7,8,9};
        List<Node> nodeList = tree.createBinTree(arr);
        System.out.println("先序遍历:");
        tree.preOrderTraverse(nodeList.get(0));
        System.out.println();
        System.out.println("中序遍历");
        tree.inorderTraversal(nodeList.get(0));
        System.out.println();
        System.out.println("后续遍历");
        tree.postorderTraversal(nodeList.get(0));
        System.out.println();
    }
}

测试结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hanliuxi4265/article/details/86629182
今日推荐