1. 顺序存储二叉树的特点
特点:
- 通常只考虑完全二叉树1
- 数组中索引为 index 的元素,其左子节点的索引为 2 * index + 1
- 数组中索引为 index 的元素,其左子节点的索引为 2 * index + 2
- 数组中索引为 index 的元素,其父节点的索引为 ( index - 1) / 2
图示:
2. 先序遍历
按照二叉树的先序遍历规则遍历数组
代码如下:
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7};
ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
arrBinaryTree.preOrder();
}
}
class ArrBinaryTree {
//存储数据节点的数组
private int[] arr;
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
/**
* 重载方法,方便传参
*/
public void preOrder() {
this.preOrder(0);
}
/**
* 顺序存储二叉树的先序遍历
*
* @param index 数组索引
*/
public void preOrder(int index) {
//如果数组为空,则打印提示信息并结束方法
if (arr == null || arr.length == 0) {
System.out.println("数组为空,无法进行先序遍历!");
return;
}
//输出当前节点的数据
System.out.print(arr[index] + "\t");
//递归遍历当前节点的左子树
if ((2 * index + 1) < arr.length) {
preOrder(2 * index + 1);
}
//递归遍历当前节点的右子树
if ((2 * index + 1) < arr.length) {
preOrder(2 * index + 2);
}
}
}
测试结果:
1 2 4 5 3 6 7
3. 中序遍历
按照二叉树的中序遍历规则遍历数组
代码如下:
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7};
ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
arrBinaryTree.midOrder();
}
}
class ArrBinaryTree {
//存储数据节点的数组
private int[] arr;
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
/**
* 重载方法,方便传参
*/
public void midOrder() {
this.midOrder(0);
}
/**
* 顺序存储二叉树的中序遍历
*
* @param index 数组索引
*/
public void midOrder(int index) {
//如果数组为空,则打印提示信息并结束方法
if (arr == null || arr.length == 0) {
System.out.println("数组为空,无法进行先序遍历!");
return;
}
//递归遍历当前节点的左子树
if ((2 * index + 1) < arr.length) {
midOrder(2 * index + 1);
}
//输出当前节点的数据
System.out.print(arr[index] + "\t");
//递归遍历当前节点的右子树
if ((2 * index + 1) < arr.length) {
midOrder(2 * index + 2);
}
}
}
测试结果:
4 2 5 1 6 3 7
4. 后序遍历
按照二叉树的后序遍历规则遍历数组
代码如下:
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7};
ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
arrBinaryTree.postOrder();
}
}
class ArrBinaryTree {
//存储数据节点的数组
private int[] arr;
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
/**
* 重载方法,方便传参
*/
public void postOrder() {
this.postOrder(0);
}
/**
* 顺序存储二叉树的后序遍历
*
* @param index 数组索引
*/
public void postOrder(int index) {
//如果数组为空,则打印提示信息并结束方法
if (arr == null || arr.length == 0) {
System.out.println("数组为空,无法进行先序遍历!");
return;
}
//递归遍历当前节点的左子树
if ((2 * index + 1) < arr.length) {
postOrder(2 * index + 1);
}
//递归遍历当前节点的右子树
if ((2 * index + 1) < arr.length) {
postOrder(2 * index + 2);
}
//输出当前节点的数据
System.out.print(arr[index] + "\t");
}
}
测试结果:
4 5 2 6 7 3 1
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。 ↩︎