线索二叉树知识点整理

为了解决在各种形态的二叉树中,空指针域多于非空指针域,造成存储浪费和不必要开销的问题,线索二叉树诞生了。既然存在着许多空指针域,我们又经常有寻找树中某节点的前驱和后继的需求,那么我们可以把二叉树中的空指针拿来存放前驱和后继。
1.二叉树的节点定义:Lchild 、Ltag、 data、 Rtag、 Rchild
要求
(1)当当前节点p没有左孩子(p->LchildNULL)的时候,Lchild指向当前节点的前驱
(2)当当前节点有左孩子(p->Lchild!=NULL)的时候,Lchild指向左孩子
(3)当当前节点p没有右孩子(p->Rchild
NULL)的时候,Rchild指向当前节点的后继
(4)当当前节点有左孩子(p->Rchild!=NULL)的时候,Rchild指向右孩子

2.要想完全理解过程,要先准备好某序下的二叉树遍历顺序,这里面明确了每个节点的前驱和后继,第一次访问的节点的前驱为NULL,最后一次访问的节点的后继为NULL

3.建立中序线索化二叉树(递归算法,参考PPT)

4.求中序线索二叉树的前驱/后继
由二叉树的要求易知,要是当前节点没有左孩子/右孩子,那么Lchild/Rchild就是它的前驱/后继;
当有左孩子时,就是左子树的最右节点;当有右孩子的时候,就是右子树的最左节点
例如
在这里插入图片描述

5.线索二叉树的遍历
既然都能找到每个节点的后继了,那就找到第一个节点,访问它之后,继续找后继访问

6.线索二叉树的更新
在节点C后插入一个新的D节点,D作为C的右子插入
注意:还是要明确插入前后该树的某序遍历,知道插入前后什么变量应该发生改变
比如插入前中序遍历顺序是BCA,插入后是BCDA,(PPT中第一个例子)在这里插入图片描述

那么就要
(1)先保留住后面的
修改D的后继标识(D->Rtag、D->Rchild)
(2)再链接上前面
C的后继标识(C->Rtag,C->Rchild)
(3)处理多余的未处理的变量
处理新增节点D的Ltag,Lchild,找到D的后继节点A
(4)链接下一个
找到D的后继A,把A的前驱L-child修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值