傳統的二叉樹是使用鏈表的形式,其優點是便於插入和刪除,但是查找速度很慢,佔用空間也很大.所以現在用數組的形式來構建二叉樹,節點存在數組中,而不是由引用相連,節點在數組中的位置對應它在樹中的位置,下標爲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數據結構(第二版)第八章