08.Java数据结构与算法分析~顺序存储二叉树
本文是上一篇文章的后续,详情点击该链接
顺序存储二叉树的概念
从数据存储来看,数组存储方式和树的存储方式可以相互转换。
也就是说,数组可以转换成树,树也可以转换成数组。
顺序存储二叉树的特点:
1.顺序二叉树通常只考虑完全二叉树
2.第n个元素的左子结点为2*n+1
3.第n个元素的右子结点为2*n+2
4.第n个元素的父结点为(n-1)/2
n表示二叉树中第几个元素(按0开始编号)
定义Tree接口
public interface Tree {
//先序遍历
void PreOrder();
//中序遍历
void InfixOrder();
//后序遍历
void PostOrder();
}
ArrBinaryTree实现类
public class ArrBinaryTree implements Tree {
private Object[] arr; //存储数据结点的数组
//构造器传值
public ArrBinaryTree(Object[] arr){
this.arr = arr;
}
//前序遍历
public void PreOrder(int index){
//如果数组为空,或者数组长度 = 0
if(arr == null || arr.length == 0){
throw new NullPointerException();
}
//输出当前元素
System.out.print(arr[index] + " ");
//向左递归遍历
if((index * 2 + 1) < arr.length) {
PreOrder(2 * index + 1);
}
//向右递归遍历
if((index * 2 + 2) < arr.length){
PreOrder(index * 2 + 2);
}
}
//中序遍历
public void InfixOrder(int index) {
//如果数组为空,或者数组长度 = 0
if(arr == null || arr.length == 0){
throw new NullPointerException();
}
//向左递归遍历
if((index * 2 + 1) < arr.length) {
InfixOrder(2 * index + 1);
}
//输出当前元素
System.out.print(arr[index] + " ");
//向右递归遍历
if((index * 2 + 2) < arr.length){
InfixOrder(index * 2 + 2);
}
}
//后序遍历
public void PostOrder(int index) {
//如果数组为空,或者数组长度 = 0
if(arr == null || arr.length == 0){
throw new NullPointerException();
}
//向左递归遍历
if((index * 2 + 1) < arr.length) {
PostOrder(2 * index + 1);
}
//向右递归遍历
if((index * 2 + 2) < arr.length){
PostOrder(index * 2 + 2);
}
//输出当前元素
System.out.print(arr[index] + " ");
}
//先序,中序,后序遍历 方法重载
public void PreOrder(){
this.PreOrder(0);
}
public void InfixOrder(){
this.InfixOrder(0);
}
public void PostOrder(){
this.PostOrder(0);
}
}
测试
public static void main(String[] args) {
Integer[]arr = {1,2,3,4,5,6,7};
Tree tree = new ArrBinaryTree(arr);
//前序遍历
tree.PreOrder();System.out.println();
//中序遍历
tree.InfixOrder();System.out.println();
//后序遍历
tree.PostOrder();
}