前一篇我们学数据结构:树,那么这一篇学习的是的:顺序存储二叉树
一、什么是顺序存储二叉树
首先先来看看概念:什么是顺序存储二叉树
从数据存储来看:[数组]存储方式
和[树]的存储方式
可以互相转换
,即是数组可以转换为树、树也可以转换为数组
根据这样的特性就会发现一些特点
顺序存储通常考虑完全二叉树!那么什么是完全二叉树呢?
二、什么是完全二叉树
我们首先回顾一下什么是二叉树
简单地理解,满足以下两个条件的树就是二叉树:
- 本身是有序树;
- 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2
上一篇文章我们提到在二叉树中,还有两个特殊的类型:满二叉树与完全二叉树
。
[满二叉树]:除了叶子节点外,所有节点都有两个节点
。
[完全二叉树]:除了最后一层以外,其他层节点个数都达到最大,并且最后一层的叶子节点向左排列
三、通过示例认识顺序存储二叉树
示例一:数组arr{1,2,3,4,5,6,7}
,要求以二叉树前序遍历
进行遍历,遍历结果为1,2,4,5,3,6,7
我们定义顺序存储二叉树:ArrBinaryTree
//定义顺序存储二叉树
class ArrBinaryTree{
private int[] arr;//存储数据结点的数组
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
public void preOrder(){
this.preOrder(0);
}
/**
* 编写二叉树前序遍历方法
* 二叉树前序遍历:先输出父节点,再遍历左子树和右子树
* 第n个元素的左节点为 2 * n + 1
* 第n个元素的右节点为 2 * n + 2
*/
private void preOrder(int index){
//判断数组是否为空
if(arr == null || arr.length == 0){
System.out.println("数组为空,不能进行二叉树前序遍历");
return;
}
//输出当前元素
System.out.println(arr[index]);
//左递归 防止数组越界
if((2 * index + 1) < arr.length){
preOrder((2 * index + 1));
}
//右递归 防止数组越界
if((2 * index + 2) < arr.length){
preOrder((2 * index + 2));
}
}
}
我们进行使用[二叉树前序遍历
]看看是否输出{1,2,4,5,3,6,7}
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 7};
//创建一个顺序存储二叉树
ArrBinaryTree arrTree = new ArrBinaryTree(arr);
arrTree.preOrder();
}
}
//运行结果如下://1 2 4 5 3 6 7
加强练习
结合前一篇文章,根据中序、后序的规则完成对数组进行二叉树中序、后续遍历的方式代码编写
四、顺序存储二叉树应用实例
八大排序算法中的堆排序、就会使用到顺序存储二叉树,关于堆排序会放在后面的文章中进行讲解与分享。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。