数据结构之线索二叉树

本文详细介绍了线索二叉树的概念,包括中序线索二叉树的建立和优点。线索二叉树通过利用空指针域存储节点的前驱和后继信息,使得在树中查找节点的前驱和后继变得简单。文章还阐述了先序和后序线索二叉树的构建方法,并解释了如何避免在先序线索化过程中可能出现的无限循环问题。同时,提供了寻找节点前驱和后继的代码实现。线索二叉树在遍历和查找操作上的便捷性是其主要优势。
摘要由CSDN通过智能技术生成

线索二叉树

中序线索二叉树

在这里插入图片描述
二叉树的性质导致有n+1个空指针域
这些空指针域,就可以用来存储,对应节点在中序遍历对应的前驱和后继
这里的前驱和后继不是树里面的是DGBEAFC这个比如G的前驱就是D后继就是B
来储存这些节点

这样的话从数的如何一个节点出发,来推它的中序遍历就看起来更可行了
但是如果是B这种节点它的右子节点是指向对应的右子树,而不是后继怎么办?,这个问题我们放在下面探索

线索二叉树的优点:找节点的前驱后继方便,遍历也方便

线索二叉树的储存结构

在这里插入图片描述
在这里插入图片描述

先序和后序线索二叉树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉树的线索化(代码实现)

找中序前驱线索化之前的方法

在中序遍历的visit()方法中插入操作
当对应的q节点等于我们想要找的p节点
那么pre节点就是p节点对应的中序前驱(中序序列中的前驱,不是树)
在这里插入图片描述
用这个思想构造线索二叉树

中序线索化

InThread操作就是新访问到的节点赋给p
在这里插入图片描述
原理:还是pre和q两个指针
进行一个中序遍历,在visit()中进行一些小操作
每个结构体定义两个变量,ltag和rtag(左线索标记和右线索标记)
当他们为1的时候指向的就是前驱节点喽

当p指向节点没有左孩子,用其左指针指向pre(前驱)
若pre对应节点没有右孩子,用其右指针指向p(后继)

此时注意第7个节点
最后也不会vist别的了
然后可能他没有右子树,所以
最后做一个检测
检查最后一个节点有没有右子树,没有的话指向NULL,rtag=1
注意中序遍历中最后一个被访问的节点肯定是没有右孩子的!!(按照左根右输出,如果有右孩子就不是最后一个节点)
在这里插入图片描述

对应的初始化
的完整代码
在这里插入图片描述

两种代码
本质都一样
在这里插入图片描述

先序线索化

和之前中序线性化一样
在这里插入图片描述
有一个问题
在这里插入图片描述
根左右,如果对应的左孩子没有,不就指向pre了吗
然后再访问左孩子就回到pre形成无限循环
解决:看ltag,ltag=0访问左子树,不等于0,直接访问右子树

后序线索化

这里不会出现转圈问题奥
在这里插入图片描述

小总结

在这里插入图片描述

在线索二叉树找前驱/后继

中序线索二叉树

找指定节点的中序后继next
理论实现
在这里插入图片描述
1.当rtag为1的话next就是对应后继

2.当rtag不为1时,按照中序遍历左中右进行遍历的原则
应该是最左下角的元素先被访问从而其为p的后继节点

代码实现在这里插入图片描述

找前驱思路
在这里插入图片描述
代码实现
在这里插入图片描述

先序线索二叉树

找先序后继
在这里插入图片描述

找先序前驱(二叉链表的话)
在这里插入图片描述
如果是三叉链表(p有一个指针指向父节点)
在这里插入图片描述
4.如果p为根节点就没有先序前驱

后序线索二叉树

在这里插入图片描述

二叉链表(不能直接找到后续)
在这里插入图片描述
三叉链表
在这里插入图片描述

总结

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值