线索二叉树中的(空链域)

空链域有线索化,非线索化

1.非线索化的二叉树

   及具有n个结点的二叉树,总共会存在n+1个空链表。(n+1个空指针,因为每个叶子结点有2个空指针,每个度为1的结点有一个空指针,及总数为2n0+n1;又我们可以知道,n0 = n2 + 1;所以空指针数为 n0  + n1 + n3 = n + 1)

2.线索化二叉树

讨论了是否可以用上述这些空指针来做为线索指针,存放前驱和后继指针,来做到像遍历链表一样遍历二叉树。

0292666b7e3d441c9a0edf96693ece87.png

(图片资源来源于csdn)

线索化后我们可以发现:

 此时空链域最大数为2个,及线索化的中序遍历二叉树

前序遍历和后序遍历则各为1个

### 二叉树后序线索化过程中的指针数量 在讨论二叉树后序线索化指针数量之前,理解什么是后序线索二叉树及其特点至关重要。对于一棵具有n个节点的二叉树,在其式存储结构中,除了实际指向子节点的指针外,还存在大量未被利用的闲指针间。 #### 定义与特性 每个节点不仅包含数据成员`data`以及两个用于接左、右孩子的指针`lchild`和`rchild`,还包括了两个布尔类型的标记变量`ltag`和`rtag`用来指示相应的指针是指向真实的子节点还是作为线索指向其他特定位置[^1]: ```c typedef struct ThreadNode { ElemType data; struct ThreadNode *lchild, *rchild; int ltag, rtag; // 左右线索标志位 } ThreadNode, *ThreadTree; ``` 当考虑后序遍历时,由于最后一个访问的是根节点,因此无法通过简单的单向接有效地找到当前节点的后续节点(即下一个要处理的节点),这使得后序线索二叉树相较于其它形式更加复杂[^2]。 #### 计算指针的数量 在一个拥有\( n \)个节点的标准二叉树中,总共有\( 2n \)个可能的指针槽位(因为每个节点有两个指针)。如果该二叉树不是完全满的,则会有一些这些指针为。具体来说,叶子结点贡献了最多的指针——每片叶子至少有两条指针;而内部节点则取决于它们是否有左右孩子。 假设在一棵含有\( n \)个节点的二叉树中有\( m \)片叶子,那么总的指针数可以表示为: \[ (m \times 2) + ((n-m)\times0 或者 1 或者 2) = 2m + k\] 其中\( k \)代表非叶节点处剩余的零散隙数目。然而,在进行后序线索化时,部分原本为的指针会被重新分配给前驱或后继关系,从而减少了真正意义上的“无意义”的指针数量。 实际上,经过后序线索化后的二叉树能够更高效地支持逆向遍历操作,尽管如此,仍然会有一定比例的原始指针保持不变,特别是那些位于分支末端且没有合适候选对象成为新线索的情况下的指针。 综上所述,虽然确切计算出所有情况下的指针总数较为困难,但在一般情况下,可以通过上述公式估算出大致范围,并认识到并非所有的初始指针都会消失于线索化过程中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值