树的实现代码:
import java.util.List;
import java.util.Queue;
import java.util.ArrayList;
public class CreateTreeByArray<E> {
//定义树节点和节点构造方法
public class Node<E>{
E data=null;
Node lchild=null;
Node rchild=null;
public Node() {
}
public Node(E data) {
this.data=data;
}
}
private Node<E> root=null; //根节点
public List<Node<E>> list=null; //节点列表,用于将数组元素转化为节点
public Node<E> getRoot(){
return this.root;
}
//将将数组转化为一颗二叉树,转换规则:依次为节点列表中节点的左右孩子赋值。左孩子为i*2+1,右孩子为i*2+2
@SuppressWarnings("unchecked")
public void createTreeByArray(Object[] array) {
this.list=new ArrayList<Node<E>>();
//将数组添加到节点列表
for(int i=0;i<array.length;i++) {
list.add(new Node<E>((E) array[i] ));
}
//为根节点赋值并显示根节点内容
System.out.println("头节点->"+list.get(0).data);
this.root=new Node<E>(list.get(0).data); //根节点
//研究下节点数组下标与树的元素之间的关系,就不难发现,只需要下标元素间正确的赋值
//数组元素就可以在没有任何移动的情况下,转化成完全二叉树。
//元素0的左,指向元素下标1,元素0的右指向元素下标2
//元素1的左,指向元素下标3,元素1的右指向元素下标3
//.....
//元素j的左,指向元素下标2j+1,元素j的右指向元素下标2j+2
for(int j=0;j<(list.size()/2);j++) {
try {
//为左子树赋值
list.get(j).lchild=list.get(2*j+1);
System.out.println("节点" + list.get(j).data + "左子树 ->" + list.get(j * 2 + 1).data);
//为右子树赋值
list.get(j).rchild=list.get(2*j+2);
System.out.println("节点" + list.get(j).data + "右子树 ->" + list.get(j * 2 + 2).data);
}catch(Exception e) {
}
}
}
//前序遍历二叉树
public void preOrderTraverse(Node<E> root) {
if(root== null)
return;
System.out.println(root.data);
preOrderTraverse(root.lchild);
preOrderTraverse(root.rchild);
}
//中序遍历二叉树
public void inOrderTraverse(Node<E> root) {
if(root== null)
return;
preOrderTraverse(root.lchild);
System.out.println(root.data);
preOrderTraverse(root.rchild);
}
//后序遍历二叉树
public void postOrderTraverse(Node<E> root) {
if(root== null)
return;
preOrderTraverse(root.lchild);
preOrderTraverse(root.rchild);
System.out.println(root.data);
}
}
测试方法以及结果
public class CreateTreeByArrayTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Object[] arrays1= {1,2,3,4,5,6,7,8,9,10};
Object[] arrays2= {"A","B","C","D","E","F","G","H","I","J"};
CreateTreeByArray<Integer> tree1= new CreateTreeByArray<>();
CreateTreeByArray<String> tree2= new CreateTreeByArray<>();
tree1.createTreeByArray(arrays1);
// tree1.createTreeByArray(arrays2);
tree1.preOrderTraverse(tree1.list.get(0));
}
}
数字1-10按前序查找的结果: