顺序存储二叉树的前、中、后序遍历
- 概念
什么是顺序存储二叉树?
我们知道顺序存储对于树这种一对多的关系结构实现起来还是很困难的,但是二叉树是一种特殊的树,由于它的特殊性,使得用顺序存储结构也可以实现。
二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现节点间的逻辑关系(父子关系,左右兄弟关系)。 - 顺序存储结构的特点:
- 顺序存储结构一般只考虑完全二叉树
- 二叉树中第n个元素的左子结点的数组下标为(2*n+1)
- 二叉树中第n个元素的右子结点的数组下标为(2*n+2)
- 第n个元素的父结点为(n-1)/2
- 图示
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8e8a88dbc31275b982facd021308caea.png)
==注意:==二叉树中元素起始下标为0,为了和数组保持一致。
我们以第二个元素为例,显然二叉树中,第二个元素为2,其下标 index=1 ,所以按照顺序存储的特点,其左子节点下标为(1*2 + 1)= 3,与图中所示的是一致的,其余元素我们就不再赘述。 - 顺序存储二叉树的遍历
需求:首先给定一个数组 {1,2,3,4,5,6,7},要求以二叉树的前、中,后、序遍历的方式进行遍历,根据上图,我们可以看出,前序遍历的结果应该是 [1,2,4,5,3,6,7],相信讲到这里我们已经可以写出其前序遍历的代码了,我在这里以前序遍历为例子,给大家展示一下代码,大家可以把剩下两种遍历方式也写出来,大同小异。 - 代码展示
class ArrBinaryTree{
int[] arr;
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
public void preOrder(int index){
if (arr.length == 0||arr == null){
System.out.println("错误");
}
System.out.print(arr[index] + "\t");
if ((index*2 + 1) < arr.length){
preOrder(index*2 + 1);
}
if ((index*2 + 2) < arr.length){
preOrder(index*2 + 2);
}
}
}
- 总结
顺序存储的二叉树有很广泛的应用,八大排序算法中的堆排序就是一个典型例子,有兴趣的同学可以去看看。