二叉树的遍历和线索二叉树--线索二叉树

一、引出线索二叉树的原因

  1. 普通二叉链表:n 个结点,总共有 `2n` 个指针域

  2. 有效孩子指针只用了 `n-1` 个

  3. 剩余n+1 个指针是空指针,极度浪费空间

思路:把空指针利用起来

  • 左空指针 → 指向该结点---遍历前驱

  • 右空指针 → 指向该结点---遍历后继

这种用指针记录遍历先后关系的二叉树 = 线索二叉树


二、线索二叉树结点结构

比普通二叉结点多两个标记位:

  • `data`:数据

  • `lchild`:左孩子 / 前驱线索

  • `rchild`:右孩子 / 后继线索

  • `ltag`:左标记

  • `ltag = 0`:lchild 指向左孩子

  • `ltag = 1`:lchild 是前驱线索

  • `rtag`:右标记

  • `rtag = 0`:rchild 指向右孩子

  • `rtag = 1`:rchild 是后继线索


三、三种线索二叉树

按照遍历方式划分:

1.先序线索二叉树

  1. 中序线索二叉树

  2. 后序线索二叉树


四、核心特点

  1. 充分利用空闲空指针,不额外占用内存

2.不用递归、不用栈,就可以遍历整棵树

  1. 可以快速查找结点在遍历序列中的前驱、后继

  2. 遍历速度更快,空间复杂度更低

  3. 本质:二叉树 + 静态链表


五、中序线索二叉树规律

  1. 最左结点:左线索为空,无前驱

  2. 最右结点:右线索为空,无后继

  3. 叶子结点:左右全是线索

  4. 二叉树 + 头尾结点连成循环双向线索链表

找前驱后继

  • 叶子结点:直接顺着线索找

  • 非叶子结点:依然要靠左右子树查找


六、优缺点

优点

  1. 非递归遍历二叉树,无需栈

  2. 快速查询前驱、后继结点

  3. 空间利用率高

缺点

  1. 插入、删除结点麻烦,需要重新修改线索

  2. 先序、后序线索树查找前驱后继复杂

  3. 不如递归遍历代码直观

相关推荐
CS创新实验室4 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
8Qi86 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS6 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
Boom_Shu8 小时前
长方形的关系
数据结构·c++·算法
Lsk_Smion9 小时前
力扣实训 _ [543].二叉树的直径 _ [23].合并K个升序列表
数据结构·算法·leetcode
ID_1800790547312 小时前
淘宝商品详情数据接口深度解析:架构、鉴权、数据结构与实战
数据结构·架构
散峰而望12 小时前
【算法练习】算法练习精选:陶陶摘苹果(基础+升级)、Music Notes、字串变换,你能AC几道?
数据结构·c++·算法·leetcode·贪心算法·github·动态规划
凤凰院凶涛QAQ13 小时前
《Java版数据结构 & 集合类剖析》集合框架的封装设计与顺序表:“从 Iterable 到 ArrayList:集合框架的‘职业树“
java·开发语言·数据结构
8Qi813 小时前
LeetCode 148. 排序链表 —— 解法一:自顶向下递归(分治 + 归并)
数据结构·算法·leetcode·链表·递归·分治·归并
8Qi813 小时前
LeetCode 148. 排序链表 —— 解法二:自底向上归并(迭代,O(1) 空间)
数据结构·算法·leetcode·链表·归并·迭代