二叉树的实现

二叉树:

参考链接:http://blog.csdn.net/luckyxiaoqiang/article/details/7518888

http://www.cnblogs.com/vamei/archive/2013/03/17/2962290.html

 

实现:

 

 

import java.util.LinkedList;

import java.util.List;

 

/**

* 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历

*

* 参考资料0:数据结构(C语言版)严蔚敏

*

* 参考资料1:http://zhidao.baidu.com/question/81938912.html

*

* 参考资料2:http://cslibrary.stanford.edu/110/BinaryTrees.html#java

*

*

*/

public class BinTreeTraverse2 {

 

 

    /**

     * 内部类:节点

     *

     *

     */

    private static class Node {

        Node leftChild;

        Node rightChild;

        int data;

 

        Node(int newData) {

            leftChild = null;

            rightChild = null;

            data = newData;

        }

    }

 

    public void createBinTree(List<Node> nodeList,int[] array) {

        // 将一个数组的值依次转换为Node节点

        for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {

            nodeList.add(new Node(array[nodeIndex]));

        }

        // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树

        for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {

            // 左孩子

            nodeList.get(parentIndex).leftChild = nodeList

                    .get(parentIndex * 2 + 1);

            // 右孩子

            nodeList.get(parentIndex).rightChild = nodeList

                    .get(parentIndex * 2 + 2);

        }

        // 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理

        int lastParentIndex = array.length / 2 - 1;

        // 左孩子

        nodeList.get(lastParentIndex).leftChild = nodeList

                .get(lastParentIndex * 2 + 1);

        // 右孩子,如果数组的长度为奇数才建立右孩子

        if (array.length % 2 == 1) {

            nodeList.get(lastParentIndex).rightChild = nodeList

                    .get(lastParentIndex * 2 + 2);

        }

    }

 

    /**

     * 先序遍历

     *

     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已

     *

     * @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 + " ");

    }

 

    public static void main(String[] args) {

        

         int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

         List<Node> nodeList = new LinkedList<Node>();

        

        BinTreeTraverse2 binTree = new BinTreeTraverse2();

        binTree.createBinTree(nodeList,array);

        

        // nodeList中第0个索引处的值即为根节点

        Node root = nodeList.get(0);

 

        System.out.println("先序遍历:");

        preOrderTraverse(root);

        System.out.println();

 

        System.out.println("中序遍历:");

        inOrderTraverse(root);

        System.out.println();

 

        System.out.println("后序遍历:");

        postOrderTraverse(root);

    }

 

}

原文地址:https://www.cnblogs.com/ustc-cui/p/4639370.html