一、顺序存储二叉树的概念
从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。八大排序算法中的堆排序,就会使用到顺序存储二叉树。
要求:
1)下
图的二叉树的结点,要求以数组
的方式来存放
arr
: [1, 2, 3, 4, 5, 6, 6]
2)
要求在遍历数组
arr
时,仍然可以以
前序遍历
,
中序遍历
和
后序遍历
的
方式完成结点的遍历
二、顺序存储二叉树的特点
1)顺序二叉树通常只考虑完全二叉树
2)第n个元素的左子节点为 2 * n + 1
3)第n个元素的右子节点为 2 * n + 2
4)第n个元素的父节点为 (n-1) / 2
5)n : 表示二叉树中的第几个元素(按0开始编号,如图所示)
三、代码演示
class ArrBinaryTree{
private int[] arr;
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
public void preOrder(int index){
if(arr==null || arr.length==0){
System.out.println("数组为空,不能遍历!");
}
System.out.println(arr[index]);//根
if((index*2+1)<arr.length){//左
preOrder(index*2+1);
}
if((index*2+2)<arr.length){//右
preOrder(index*2+2);
}
}
public void infixOrder(int index){
if(arr==null || arr.length==0){
System.out.println("数组为空,不能遍历!");
}
if((index*2+1)<arr.length){//左
infixOrder(index*2+1);
}
System.out.println(arr[index]);//根
if((index*2+2)<arr.length){//右
infixOrder(index*2+2);
}
}
public void afterOrder(int index){
if(arr==null || arr.length==0){
System.out.println("数组为空,不能遍历!");
}
if((index*2+1)<arr.length){//左
afterOrder(index*2+1);
}
if((index*2+2)<arr.length){//右
afterOrder(index*2+2);
}
System.out.println(arr[index]);//根
}
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7};
ArrBinaryTree tree=new ArrBinaryTree(arr);
tree.preOrder(0);//1245367
tree.infixOrder(0);//4251637
tree.afterOrder(0);//4526731
}
前序遍历:
1 2 4 5 3 6 7
中序遍历:
4 2 5 1 6 3 7
后序遍历:
4 5 2 6 7 3 1