二叉树除了可以使用一维数组存储,还可以使用链表形式。使用链表的好处是对节点的增删很容易实现。可以定义两个类:节点类TreeNode和二叉树类BinaryTree。BinaryTree类包含根节点以及添加节点的方法addNode(int value),TreeNode类包含成员value以及其左右子节点。这样,在创建二叉树时,所有节点之间的关系便确定了。以下为实现代码
import java.util.*;
public class BinaryTreeLink {
public static ArrayList<TreeNode> cachePre = new ArrayList<>();//存储前序遍历结果
public static ArrayList<TreeNode> cacheIn = new ArrayList<>();//存储中序遍历结果
public static ArrayList<TreeNode> cachePost = new ArrayList<>();//存储后序遍历结果
public static void main(String[] args){
int[] data = {6, 3, 5, 9, 7, 8, 4, 2};
BinaryTree tree = new BinaryTree(data);
preOrder(tree.rootNode);
inOrder(tree.rootNode);
postOrder(tree.rootNode);
System.out.println("The initial data: ");
for(int i:data){
System.out.print(i+" ");
}
System.out.println();
System.out.println("前序遍历:");
for(TreeNode i:cachePre){
System.out.print(i.value+" ");
}
System.out.println();
System.out.println("中序遍历:");
for(TreeNode i:cacheIn){
System.out.print(i.value+" ");
}
System.out.println();
System.out.println("后序遍历:");
for(TreeNode i:cachePost){
System.out.print(i.value+" ");
}
System.out.println();
}
public static void preOrder(TreeNode node){//前序遍历
if(node!=null){
cachePre.add(node);
preOrder(node.leftNode);
preOrder(node.rightNode);
}
}
public static void inOrder(TreeNode node){//中序遍历
if(node!=null){
inOrder(node.leftNode);
cacheIn.add(node);
inOrder(node.rightNode);
}
}
public static void postOrder(TreeNode node){//后序遍历
if(node!=null){
postOrder(node.leftNode);
postOrder(node.rightNode);
cachePost.add(node);
}
}
}
class TreeNode{//节点类
int value;
TreeNode leftNode;
TreeNode rightNode;
public TreeNode(int value){
this.value = value;
this.leftNode = null;
this.rightNode = null;
}
}
class BinaryTree{//二叉树类
public TreeNode rootNode;
public BinaryTree(int[] data){//根据原始数据,添加树节点
for(int i:data){
addNode(i);
}
}
public void addNode(int value){//添加树节点遵循左小右大的原则
if(rootNode==null){rootNode = new TreeNode(value);return;}
TreeNode currentNode = rootNode;
while(true){
if(value>currentNode.value){
if(currentNode.rightNode==null){currentNode.rightNode = new TreeNode(value);return;}
currentNode = currentNode.rightNode;
}
else{
if(currentNode.leftNode==null){currentNode.leftNode = new TreeNode(value);return;}
currentNode = currentNode.leftNode;
}
}
}
}
输出:
The initial data:
6 3 5 9 7 8 4 2
前序遍历:
6 3 2 5 4 9 7 8
中序遍历:
2 3 4 5 6 7 8 9
后序遍历:
2 4 5 3 8 7 9 6