建议先实现二叉树
一、什么是顺序存储二叉树
基本说明
从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组
要求
- 二叉树的结点能够以数组的方式来存放 arr: [1,2,3,4,5,6,7];
- 遍历数组时能够以前序遍历,中序遍历,后序遍历的方式遍历出所有结点
特点
- 顺序二叉树通常只考虑完全二叉树
- 第n个元素的左子节点为 2 * n + 1
- 第n个元素的右子节点为 2 * n + 2
- 第n个元素的父节点为 (n-1) / 2
- n : 表示二叉树中的第几个元素(按0开始编号,如图所示)
二、代码实现
1.前序遍历
class ArrayBinaryTree {
//存储数据节点的数组
private int[] array;
public ArrayBinaryTree(int[] array) {
this.array = array;
}
//前序遍历入口
public void preOrder() {
preOrder(0);
}
/**
* 前序遍历
* @param index
*/
public void preOrder(int index) {
//如果数组为空或数组.length==0
if (array == null || array.length == 0) {
System.out.println("数组为空,不能按照二叉树的前序遍历!");
}
//输出当前这个元素
System.out.print(array[index]+" ");
//向左递归遍历
if ((index * 2 + 1) < array.length) {
preOrder(2 * index + 1);
}
//向右递归遍历
if ((index * 2 + 2) < array.length) {
preOrder(2 * index + 2);
}
}
2.中序遍历
class ArrayBinaryTree {
//存储数据节点的数组
private int[] array;
public ArrayBinaryTree(int[] array) {
this.array = array;
}
//中序遍历入口
public void infixOrder() {
infixOrder(0);
}
/**
* 中序遍历
* @param index
*/
private void infixOrder(int index) {
//如果数组为空或数组.length==0
if (array == null || array.length == 0) {
System.out.println("数组为空,不能按照二叉树的前序遍历!");
}
//向左递归遍历
if ((index * 2 + 1) < array.length) {
infixOrder(2 * index + 1);
}
//输出当前这个元素
System.out.print(array[index]+" ");
//向右递归遍历
if ((index * 2 + 2) < array.length) {
infixOrder(2 * index + 2);
}
}
2.后序遍历
class ArrayBinaryTree {
//存储数据节点的数组
private int[] array;
public ArrayBinaryTree(int[] array) {
this.array = array;
}
//后序遍历入口
public void postOrder() {
infixOrder(0);
}
/**
* 后序遍历
* @param index
*/
private void postOrder(int index) {
//如果数组为空或数组.length==0
if (array == null || array.length == 0) {
System.out.println("数组为空,不能按照二叉树的前序遍历!");
}
//向左递归遍历
if ((index * 2 + 1) < array.length) {
postOrder(2 * index + 1);
}
//向右递归遍历
if ((index * 2 + 2) < array.length) {
postOrder(2 * index + 2);
}
//输出当前这个元素
System.out.print(array[index]+" ");
}
启动入口
public class ArrayBinaryTreeDemo {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6, 7};
ArrayBinaryTree tree = new ArrayBinaryTree(array);
System.out.println("前序");
tree.preOrder();
System.out.println();
System.out.println("中序");
tree.infixOrder();
System.out.println();
System.out.println("后序");
tree.postOrder();
System.out.println();
}
}