顺序存储二叉树(思路分析)
我们的顺序存储二叉树在堆排序中就会使用到
顺序存储二叉树的概念:
从数据存储的角度来看: 数组存储方式和树的存储方式之间可以相互转换, 也即是数组可以转换为树,树也可以转换为数组
- 其实说白了: 顺序存储二叉树就是将我们的二叉树存储到一个数组中,就是将一个具体的二叉树存储到一个数组中, 这个时候有的人会说:那么我们将一个二叉树存储到了数组中之后这个结构还算是一个二叉树?
- 这个时候我们将这个具体的二叉树存储到一个数组中之后遍历这个数组中的元素的时候不是按照数组遍历的方式进行遍历,而是按照我们的二叉树的方式进行一个遍历, 也就是虽然此时我们将这个具体的二叉树存储到了一个数组中 ,但是这个时候我们对这个数组操作的的时候不是按照数组的方式进行操作,而是按照二叉树的方式进行操作, 具体的如果将存储到数组中的元素按照二叉树的方式进行操作我们后面就会进行一个具体的讲解
数据是一个顺序存储结构, 所以我们将二叉树存储到数组中之后就称之为: 顺序存储二叉树
顺序存储二叉树图解(示例):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICRaNB5m-1667387594356)(E:\非凡英才\数据结构(java)]\数据结构图解\顺序存储二叉树图解.png)
具体代码实现顺序存储二叉树的要求:
- 将上面示例中的结点以数组的形式存放
- 要求在遍历的数组的时候仍然可以使用二叉树的前序,中序, 后序遍历的方式完成对结点的遍历
那么我们如何将这个数组中的元素使用二叉树的前序,中序,后序遍历的方式进行一个遍历?
- 这里我们就来讲解一些对应的顺序存储二叉树的一些特点:
- 顺序存储二叉树通常只考虑完全二叉树
- 第n个元素的左子节点为2*n + 1
- 第n个元素的右子节点为2*n + 2
- 第n个元素的父节点为(n - 1)/2
- n表示的是二叉树中的第几个元素,从0开始编号
- 这里因为是使用数组进行了存储,在数组中元素是从0开始编号的(所以我们这里的规则其实就是根据数组的下标指定的规则)
- 其实2,3,4三个特点我们也可以通过等比数列推导出来,或者我们使用画图法也可以很快就推导出我们数组中存储二叉树的特点
小结: 我们的二叉树, 尤其是满二叉树,很多时候我们可以使用等比数列来进行一个类比
补充:
那么我们前面说我们的顺序存储二叉树就是使用数组存储一个具体的二叉树, 那么我们一个单纯的数组是不是就等于也是一个顺序存储二叉树?
- 其实不是的, 我们的顺序存储二叉树是一个底层使用数组实现的虚拟二叉树, 一个单纯的数组并不能看做是一个顺序存储二叉树, 必须要是数组作为底层的实现,并且配合上我们的顺序存储二叉树中的一些特有的方法(也就是要具有二叉树类的一些通用功能)封装而成的类,这样的类我们才能真正的称之为一个顺序存储二叉树
- 如果一个数组中只是单纯的存储了一个二叉树中的元素,这个时候这个数组其实还是一个数组而已,但是如果我们将一个数组封装到一个类中, 并且这个类中还封装一些可以将这个数组中的元素以二叉树的形式操作的一些方法, 这个时候我们这个类就可以称之为是一个顺序存储二叉树了