传统的二叉树是使用链表的形式,其优点是便于插入和删除,但是查找速度很慢,占用空间也很大.所以现在用数组的形式来构建二叉树,节点存在数组中,而不是由引用相连,节点在数组中的位置对应它在树中的位置,下标为0 的节点为根节点,下标为1是根的左节点,2为根节点的右节点,依次类推,从左到右的顺序存储树的每一层,包括空节点.如下图:
找节点的子节点和父节点可以利用简单的算术计算它们在数组中的索引值
设某个节点索引值为index,则节点的左子节点索引为:
2*index+1
右子节点索引为:
2*index+2
父节点索引为:
(index-1)/2
总结:
大多数情况下用数组表示数不是很有效率,除非是完全二叉树.但是普通的二叉树,特别是有很多空节点的.会有很多空洞,浪费存储空间.用数组表示树,删除节点是很费时费力的.
所以用数组表示树适合用于 完全二叉树查找,和插入.下面是我自己写的代码,比较简单:
public class ArrayTree {
private int[] arrayTree;
private int size = 0;
public ArrayTree() {
super();
arrayTree = new int[10];
}
public void insert(int num) {
if (search(0, num) != -1)
return;
if (arrayTree.length == 0) {
arrayTree[0] = num;
} else {
insert(0, num);
}
}
public void insert(int index, int num) {
if (arrayTree.length < 2 * index + 2) {
reSize(2 * index + 2);
}
if (arrayTree[index] == 0) {
arrayTree[index] = num;
size++;
return;
}
if (num > arrayTree[index]) {
insert(2 * index + 2, num);
} else {
insert(2 * index + 1, num);
}
}
public void reSize(int length) {
int[] newArrayTree = new int[length];
System.arraycopy(arrayTree, 0, newArrayTree, 0, arrayTree.length);
arrayTree = newArrayTree;
}
public int search(int num) {
return search(0, num);
}
public int search(int index, int num) {
if (arrayTree.length <= index)
return -1;
if (arrayTree[index] == num)
return index;
if (num > arrayTree[index]) {
return search(2 * index + 2, num);
} else {
return search(2 * index + 1, num);
}
}
public int get(int index) {
if (arrayTree.length > index) {
return arrayTree[index];
} else {
return -1;
}
}
public static void main(String[] args) {
ArrayTree arrayTree = new ArrayTree();
arrayTree.insert(50);
arrayTree.insert(25);
arrayTree.insert(76);
arrayTree.insert(37);
arrayTree.insert(62);
arrayTree.insert(84);
arrayTree.insert(31);
arrayTree.insert(43);
arrayTree.insert(55);
arrayTree.insert(92);
System.out.println("get:" + arrayTree.get(10));
System.out.println("index:" + arrayTree.search(24));
System.out.println("size:" + arrayTree.size);
}
}
输出:
get:43
index:3
size:11
参考:java数据结构(第二版)第八章