详细看注释:
import java.io.*;
import javax.swing.JOptionPane;
import java.util.*;
/**
* 功能:读入文件里的数据存入二叉树中,然后进行3种方式的遍历
*
* 参考资料0:数据结构(C语言版)严蔚敏
*/
/**
* 外部类:节点
*
* @author ocaicai@yeah.net @date: 2011-5-17
*
*/
class Node {
Node leftChild;
Node rightChild;
int data;
Node(int newData) {
leftChild = null;
rightChild = null;
data = newData;
}
}
class BinTreeTraverse{
List<Node> nodeList = null;
public void createBinTree(int array[],int array_length) {
nodeList = new LinkedList<Node>();
// 将一个数组的值依次转换为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 + " ");
}
}
class Example8_1{
public static void main(String[] args) {
byte buffer[] = new byte[2056];
int array[]=new int[100];
int node_num,j=0,c=0;
int bytes;
String str;
String str1;
try{
File file = new File(args[0]);
FileInputStream fileInput = new FileInputStream(file);
bytes = fileInput.read(buffer);
System.out.println("The total bytes number is:"+bytes);
//从缓冲数组buffer[]取出数据存入整型数组array[]
for(int i=0;i<bytes;i++){
if(buffer[i]=='\n'){
System.out.println("遇到换行符退出数据提取");
break;
}else if(buffer[i]!=' '){
j=j*10+(buffer[i]-'0');
}else{
array[c]=j;
++c;
j=0;
}
}
System.out.println("打印数组内的数据:");
for(int i=0;i<c;i++){
System.out.print(array[i]+" ");
}
//建立二叉树以及遍历
System.out.println();
System.out.println("\n二叉树建立以及遍历:");
BinTreeTraverse binTree = new BinTreeTraverse();
binTree.createBinTree(array,c);
// nodeList中第0个索引处的值即为根节点
Node root = binTree.nodeList.get(0);
System.out.println("先序遍历:");
binTree.preOrderTraverse(root);
System.out.println();
System.out.println("中序遍历:");
binTree.inOrderTraverse(root);
System.out.println();
System.out.println("后序遍历:");
binTree.postOrderTraverse(root);
}
catch(Exception e){
str = e.toString();
}
System.exit(0);
}
}
txt文件数据格式见下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
测试用满二叉树存储数据文件。
read me : 存储完全二叉树的数据只能在第一行,而且每个数据后必须跟一个空格,第一行不能出现数字字符和空格字符以外的字符。
运行举例:
java Example8_1 aaa.txt