一、顺序存储
利用满二叉树的性质,每层的节点数1,2,4,8......,所以一颗深度为i的二叉树最多只能包含2 (i) - 1 (i是以指数的形式求出来的,此处利用等比数列求和),因此需要设置一个相同长度的数组来存储这个二叉树,若是空出来的节点,则数组元素留空即可。
参考代码:
public class ArrayBinaryTree<T> {
//使用数组来存储它的所有节点
private Object[] datas;
private int DEFAULT_DEEP = 10;
//记录该树的深度
private int deep;
private int arraySize;
//默认的深度创建一个二叉树
public ArrayBinaryTree(){
this.deep = DEFAULT_DEEP;
this.arraySize = (int)Math.pow(2, deep) - 1;//等比数列求和
datas = new Object[arraySize];
}
//以指定深度创建一个二叉树
public ArrayBinaryTree(int deep){
this.deep = deep;
this.arraySize = (int)Math.pow(2, deep) - 1;
datas = new Object[arraySize];
}
//以指定深度和指定的创建一个二叉树
public ArrayBinaryTree(int deep, T root){
this.deep = deep;
this.arraySize = (int)Math.pow(2, deep) - 1;
datas = new Object[arraySize];
datas[0] = root;
}
/**
* 为指定的节点添加子节点
* @param index 需要添加的子节点的父节点的索引
* @param data 新的节点的数据
* @param left 是否为左节点
*/
public void addNode(int index, T data, boolean left){
if(datas[index] == null){
throw new RuntimeException("空节点,无法添加!");
}
if(2 * index + 1 >= arraySize){
throw new RuntimeException("底层已满,越界异常!");
}
if(left){
datas[2 * index + 1] = data;
}
else{
datas[2 * index + 2] = data;
}
}