标签:
二叉树:
参考链接: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);
????}
?
}
标签:
原文地址:http://www.cnblogs.com/ustc-cui/p/4639370.html