23、数据结构——二叉树——存储结构
一、顺序存储方式
结构体
1 |
|
初始化所有结点均为空
1 |
|
完全二叉树中有n个结点,则
判断 i 是否有左孩子? 2i <= n
判断 i 是否有右孩子?2i + 1 <= n
判断 i 是否是叶子结点 / 分支结点?
$$
i > \lfloor \frac{n}{2}\rfloor
$$
如果此时的二叉树是非完全二叉树,那么顺序存储就失效了(如图)
因此我们这里顺序存储的方式需要稍微变一下,变为下图这种形式:
这时候我们如果还希望查找某个结点是否有左孩子、右孩子等,就必须通过结构体中的 isEmpty 来判断了。比如说你想查6结点是否有左孩子结点,此时你就可以通过判断t[2*i].isEmpty 来判断左孩子结点是否为空。
注意
当然,虽然顺序存储查找元素的速度是很快,这里顺序存储的缺点也是非常明显的!比如说:他的空间利用率特别低!所以我们如果想使用顺序存储方式存树,一般只建议存完全二叉树。
二、链式存储结构
结构体
1 |
|
提问
对于n个==二叉链表==共有多少个==空链域==?除了根节点外,其他n-1个结点的头上都会连接1个结点,对不对?我们又知道一共是有2*n个指针域的,那么空指针域不就等于2n - (n - 1) = n + 1个了吗?答案就是n + 1。(可结合下图进行理解)
定义一棵空树
1 |
|
插入根节点
1 |
|
插入新节点
1 |
|
下面介绍一下问题:如何查询1个结点是否有孩子结点(编号是从1开始的),这个问题就需要等到下一节的遍历的时候来讲了
下一节内容是24、二叉树——前中后序遍历…….