news 2026/4/27 11:50:19

线索二叉树是一种对普通二叉树进行扩展的数据结构,旨在提高遍历效率

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线索二叉树是一种对普通二叉树进行扩展的数据结构,旨在提高遍历效率

线索二叉树是一种对普通二叉树进行扩展的数据结构,旨在提高遍历效率。其核心思想是利用二叉链表中大量的空指针域来保存节点在某种遍历顺序下的前驱和后继信息。

  1. 定义
    线索二叉树(Threaded Binary Tree)是在二叉树的基础上,通过修改空指针使其指向该节点在某种遍历序列(如先序、中序或后序)中的前驱或后继节点,从而形成的特殊二叉树。这种被“线索化”的结构使得不使用递归或栈也能高效地进行遍历操作。

  2. 存储结构
    每个节点包含五个部分:

    • ltag:左标志位,0 表示lchild指向左孩子,1 表示lchild指向前驱;
    • lchild:左指针;
    • data:数据域;
    • rchild:右指针;
    • rtag:右标志位,0 表示rchild指向右孩子,1 表示rchild指向后继。

    结构示例如下(以中序线索二叉树为例):

    A / \ B C / \ D E

    中序遍历为:D → B → E → A → C
    线索化后,D 的rchild(原为空)将指向 B(后继),B 的lchild(若为空)将指向前驱 D,以此类推。

  3. 线索化过程
    在进行中序遍历时,设置一个全局指针pre初始为null,当访问当前节点p时:

    • pre != nullpre的右指针为空,则将其rtag设为 1,并让rchild指向p(即pre的后继是p);
    • p的左指针为空,则将其ltag设为 1,并让lchild指向pre(即p的前驱是pre);
    • 更新pre = p,继续遍历。

    示例代码(中序线索化):

    typedefstructThreadNode{chardata;structThreadNode*lchild,*rchild;intltag,rtag;// 0: child, 1: thread}ThreadNode,*ThreadTree;ThreadNode*pre=NULL;// 指向前一个访问的节点voidinorderThreading(ThreadNode*p){if(p==NULL)return;inorderThreading(p->lchild);// 遍历左子树// 处理当前节点if(p->lchild==NULL){p->ltag=1;p->lchild=pre;}if(pre!=NULL&&pre->rchild==NULL){pre->rtag=1;pre->rchild=p;}pre=p;inorderThreading(p->rchild);// 遍历右子树}
  4. 作用与优势

    • 提高遍历效率:无需栈或递归即可完成遍历;
    • 节省空间:利用原本浪费的空指针域存储有用信息;
    • 快速查找前驱/后继:在线索二叉树中可直接定位某节点的直接前驱或后继;
    • 适用于频繁遍历但结构稳定的二叉树场景。
      实现中序线索二叉树的非递归遍历,关键在于利用ltagrtag标志位判断指针是指向孩子还是线索(前驱/后继),从而避免使用栈或递归。

基本思路:

  1. 从根节点开始,找到中序序列的第一个节点(即最左下的节点);
  2. 遍历过程中:
    • 若当前节点的rtag == 1,说明rchild指向的是中序后继,直接跳转;
    • rtag == 0,说明有右孩子,则进入右子树,并找到该子树中序遍历的第一个节点(即右子树中最左边的节点);
  3. 重复直到所有节点访问完毕。

C语言实现代码:

#include<stdio.h>typedefstructThreadNode{chardata;structThreadNode*lchild,*rchild;intltag,rtag;// 0: child, 1: thread}ThreadNode,*ThreadTree;// 非递归中序遍历线索二叉树voidinorderTraverse(ThreadTree root){ThreadNode*p=root;// 找到中序第一个节点:一直向左直到 ltag == 1while(p!=NULL&&p->ltag==0){p=p->lchild;}// 遍历整个线索二叉树while(p!=NULL){printf("%c ",p->data);// 访问当前节点// 如果 rtag == 1,rchild 是后继线索,直接跳转if(p->rtag==1){p=p->rchild;}// 否则进入右子树,找右子树的最左节点else{p=p->rchild;while(p!=NULL&&p->ltag==0){p=p->lchild;}}}}

示例说明:

假设有一棵中序线索化的二叉树如下:

A / \ B C / \ D E

中序遍历序列:D → B → E → A → C

线索化后:

  • D 的rchild指向 B(后继),rtag = 1
  • B 的lchild指向 D(前驱),ltag = 1
  • E 的rchild指向 A(后继),rtag = 1
  • A 的lchild指向 E(前驱),ltag = 1
  • C 的前后无更多节点,视情况处理

调用inorderTraverse(root)将输出:D B E A C


注意事项:

  • 必须确保线索化已完成,否则行为未定义;
  • 头节点可增设一个“头结点”统一管理起始与结束(如将最后一个节点的后继指向头结点,形成循环线索树);
  • 时间复杂度:O(n),每个节点访问一次;
  • 空间复杂度:O(1),无需额外栈空间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 16:13:49

YOLOv8 Cannot find module 错误修复指南

YOLOv8 Cannot find module 错误修复指南 在部署 YOLOv8 模型时&#xff0c;你是否曾遇到这样的报错&#xff1a; ModuleNotFoundError: No module named ultralytics明明已经拉取了官方镜像、启动了容器&#xff0c;为什么连最基本的 from ultralytics import YOLO 都无法执行…

作者头像 李华
网站建设 2026/4/25 12:14:01

YOLOv8模型版本管理:Git Tag发布规范说明

YOLOv8模型版本管理&#xff1a;Git Tag发布规范说明 在现代深度学习项目中&#xff0c;尤其是像YOLOv8这样迭代频繁、应用场景复杂的模型开发过程中&#xff0c;一个常见的困扰是&#xff1a;“我们上周训练的那个性能最好的模型&#xff0c;到底用的是哪份代码&#xff1f;用…

作者头像 李华
网站建设 2026/4/20 1:17:32

论文 AI 率到底怎么降?别再乱改了

一、为什么手动降重总翻车&#xff1f;学术党必知的3大痛点“明明查重率达标了&#xff0c;导师却说论文有AI味要求重写&#xff01;”——这是不是你的真实写照&#xff1f;很多同学误以为同义词替换调整句式就能蒙混过关&#xff0c;结果陷入三大困局&#xff1a;❌ 痛点1&am…

作者头像 李华
网站建设 2026/4/27 0:11:09

论文降 AI 率的正确思路,比改词重要

一、为什么手动降重总翻车&#xff1f;学术党必知的3大痛点“明明查重率达标了&#xff0c;导师却说论文有AI味要求重写&#xff01;”——这是不是你的真实写照&#xff1f;很多同学误以为同义词替换调整句式就能蒙混过关&#xff0c;结果陷入三大困局&#xff1a;❌ 痛点1&am…

作者头像 李华
网站建设 2026/4/23 7:11:13

YOLOv8在低光照条件下的表现优化策略

YOLOv8在低光照条件下的表现优化策略 在城市夜间监控、无人巡检设备和车载夜视系统中&#xff0c;我们常常面临一个共性难题&#xff1a;光线不足导致图像质量严重退化。画面里的人影模糊不清&#xff0c;车辆轮廓难以分辨&#xff0c;甚至连最基本的检测框都难以稳定输出。这种…

作者头像 李华
网站建设 2026/4/21 1:24:48

YOLOv8单元测试编写规范与执行方法

YOLOv8单元测试编写规范与执行方法 在现代AI工程实践中&#xff0c;模型训练和推理只是整个开发流程的一环。真正决定项目能否稳定落地的&#xff0c;是背后那套看不见却至关重要的质量保障体系——其中&#xff0c;单元测试正是关键的第一道防线。 以YOLOv8为例&#xff0c;作…

作者头像 李华