1、顺序存储二叉树概念
顺序存储二叉树应用实例:堆排序
2、代码实现
package arr_binary_tree;/**
* @author zhihua.li
* @date 2021/2/16 - 17:31
**/
/**
* @program: DataStructure
* @description: 用数组存放二叉树(顺序存储二叉树)(常用于堆排序)
* 顺序存储二叉树 : 通常情况下只针对完全二叉树
* 假设某节点在数组中下标为index,则其左子节点在数组中下标为2*index+1;右子节点在数组中下标为2*index+2
* @author: zhihua li
* @create: 2021-02-16 17:31
*/
public class ArrayBinaryTree {
private int[] arr;
public ArrayBinaryTree(int[] arr) {
this.arr = arr;
}
// 通常情况下遍历只会从根节点开始,因此可以重载下面的方法
public void preIterate() {
preIterate(0);
}
// 先序遍历顺序存储二叉树
public void preIterate(int index) {
if (arr == null || arr.length == 0) {
System.out.println("传入空数组,无法遍历");
return;
}
// 根据根左右的顺序打印出该数组的结构
System.out.print(arr[index]+"\t");
if (2 * index + 2 < arr.length) {
preIterate(2 * index + 1);
}
if (2 * index + 2 < arr.length) {
preIterate(2 * index + 2);
}
}
// 通常情况下遍历只会从根节点开始,因此可以重载下面的方法
public void midIterate() {
midIterate(0);
}
// 中序遍历顺序存储二叉树
public void midIterate(int index) {
if (arr == null || arr.length == 0) {
System.out.println("传入空数组,无法遍历");
return;
}
if (2 * index + 2 < arr.length) {
midIterate(2 * index + 1);
}
System.out.print(arr[index]+"\t");
if (2 * index + 2 < arr.length) {
midIterate(2 * index + 2);
}
}
// 后序遍历顺序存储二叉树
public void postIterate(int index) {
if (arr == null || arr.length == 0) {
System.out.println("传入空数组,无法遍历");
return;
}
if (2 * index + 2 < arr.length) {
postIterate(2 * index + 1);
}
if (2 * index + 2 < arr.length) {
postIterate(2 * index + 2);
}
System.out.print(arr[index]+"\t");
}
}
3、小技巧:对常用的方法进行进一步封装
// 通常情况下遍历只会从根节点开始,因此可以重载下面的方法
public void postIterate() {
postIterate(0);
}
4、代码测试
package arr_binary_tree;/**
* @author zhihua.li
* @date 2021/2/16 - 17:39
**/
/**
*@program: DataStructure
*@description: 测试顺序存储二叉树
*@author: zhihua li
*@create: 2021-02-16 17:39
*/
public class ArrayBinaryTreeTest {
public static void main(String[] args) {
int arr[] = {1,2,3,4,5,6,7};
ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);
System.out.println("前序遍历该顺序存储二叉树为:");
/*
通常情况下遍历只会从根节点开始,因此可以重载下面的方法为:
public void preIterate(){
preIterate(0);
}*/
arrayBinaryTree.preIterate();
System.out.println();
System.out.println("中序遍历该顺序存储二叉树为:");
arrayBinaryTree.midIterate();
System.out.println();
System.out.println("后序遍历该顺序存储二叉树为:");
arrayBinaryTree.postIterate();
}
}