24考研数据结构-线索二叉树的线索化

news2025/1/16 7:44:02

目录

    • 数据结构:线索二叉树与线索化
      • 线索二叉树的定义
      • 线索化过程
      • 线索化的应用
      • 总结
    • 5.3.2线索二叉树
      • 1. 线索二叉树的概念与作用
      • 2.线索二叉树的存储结构
      • 3. 二叉树的线索化
        • 1. 中序线索化
        • 2. 先序线索化
        • 3. 后序线索化
      • 4. 线索树的寻找前驱后继的各种情况(多理解)

数据结构:线索二叉树与线索化

在二叉树中,每个节点最多有两个子节点,通常我们将其称为左子节点和右子节点。然而,在实际应用中,我们可能需要更高效地遍历二叉树,而传统的递归遍历方式可能会导致栈溢出或效率较低。线索二叉树是一种特殊的二叉树结构,通过添加线索化信息,使得我们可以在不使用递归或栈的情况下实现二叉树的遍历。

线索二叉树的定义

线索二叉树是对普通二叉树的扩展,它在每个节点中添加了两个指针,称为线索。这些线索指针将二叉树中的空指针转换为前驱或后继节点,从而形成了一种新的数据结构。

线索二叉树的特点:

  1. 线索化指针:每个节点的左子节点为空时,将其左指针线索化为其前驱节点;每个节点的右子节点为空时,将其右指针线索化为其后继节点。
  2. 前序线索化:节点的前序线索化是指将其左指针线索化为前驱节点,使得我们可以直接通过线索指针向前遍历。
  3. 中序线索化:节点的中序线索化是指将其右指针线索化为后继节点,使得我们可以直接通过线索指针向后遍历。

线索化过程

线索化二叉树的过程分为前序线索化、中序线索化和后序线索化三个步骤。以中序线索化为例进行说明:

  1. 对于节点p,若其左子节点为空,将左指针线索化为其前驱节点pre,并将标记bitLeftThread设置为1。
  2. 对于节点p的前驱节点pre,若其右子节点为空,将右指针线索化为其后继节点p,并将标记bitRightThread设置为1。
  3. 递归线索化节点p的左子树和右子树。

线索化的应用

线索二叉树的线索化过程使得二叉树的遍历更加高效,我们可以不需要使用递归或栈来实现遍历,而是通过线索化的指针直接进行前序、中序和后序的遍历。

线索化二叉树的应用场景包括:

  1. 高效的遍历算法:由于线索化的指针指向前驱和后继节点,我们可以在常数时间内找到下一个节点,从而提高遍历的效率。
  2. 空间优化:线索化二叉树不需要额外的栈空间来进行递归遍历,节省了存储空间。

总结

线索二叉树是一种特殊的二叉树结构,通过线索化的指针使得二叉树的遍历更加高效。线索化的过程可以将二叉树的空指针转换为前驱或后继节点,从而形成一种新的数据结构。线索二叉树的应用场景包括高效的遍历算法和空间优化。通过学习线索二叉树,我们可以更好地理解数据结构的应用和优化方法。

5.3.2线索二叉树

从某个节点的前驱后继、遍历都很不方便
在这里插入图片描述

1. 线索二叉树的概念与作用

在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。

2.线索二叉树的存储结构

在这里插入图片描述

  • 中序线索二叉树——线索指向中序前驱、中序后继
//线索二叉树结点
typedef struct ThreadNode{
   ElemType data;
   struct ThreadNode *lchild, *rchild;
   int ltag, rtag;                // 左、右线索标志
}ThreadNode, *ThreadTree;



  • 先序线索二叉树——线索指向先序前驱、先序后继

  • 后序线索二叉树——线索指向后序前驱、后序后继

3. 二叉树的线索化

在这里插入图片描述

全局变量pre

1. 中序线索化

typedef struct ThreadNode{
   int data;
   struct ThreadNode *lchild, *rchild;
   int ltag, rtag;                // 左、右线索标志
}ThreadNode, *ThreadTree;

//全局变量pre, 指向当前访问的结点的前驱
TreadNode *pre=NULL;

void InThread(ThreadTree T){
    if(T!=NULL){
        InThread(T->lchild);    //中序遍历左子树
        visit(T);               //访问根节点
        InThread(T->rchild);    //中序遍历右子树
    }
}

void visit(ThreadNode *q){
   if(q->lchid = NULL){                 //左子树为空,建立前驱线索   
      q->lchild = pre;
      q->ltag = 1;
   }

   if(pre!=NULL && pre->rchild = NULL){ 
      pre->rchild = q;           //建立前驱结点的后继线索
      pre->rtag = 1;
   }
   pre = q;
}

//中序线索化二叉树T
void CreateInThread(ThreadTree T){
   pre = NULL;                //pre初始为NULL
   if(T!=NULL);{              //非空二叉树才能进行线索化
      InThread(T);            //中序线索化二叉树
      if(pre->rchild == NULL)
         pre->rtag=1;         //处理遍历的最后一个结点
   }
}



2. 先序线索化

注意【转圈】问题,当ltag==0时,才能对左子树先序线索化

typedef struct ThreadNode{
   int data;
   struct ThreadNode *lchild, *rchild;
   int ltag, rtag;                // 左、右线索标志
}ThreadNode, *ThreadTree;

//全局变量pre, 指向当前访问的结点的前驱
TreadNode *pre=NULL;

//先序遍历二叉树,一边遍历一边线索化
void PreThread(ThreadTree T){
   if(T!=NULL){
      visit(T);
      if(T->ltag == 0)         //lchild不是前驱线索
      //并且由于中序和后序都已经处理完了左子树,所以用不到lchild
         PreThread(T->lchild);
      PreThread(T->rchild);
   }
}

void visit(ThreadNode *q){
   if(q->lchid = NULL){                 //左子树为空,建立前驱线索   
      q->lchild = pre;
      q->ltag = 1;
   }

   if(pre!=NULL && pre->rchild = NULL){ 
      pre->rchild = q;           //建立前驱结点的后继线索
      pre->rtag = 1;
   }
   pre = q;
}

//先序线索化二叉树T
void CreateInThread(ThreadTree T){
   pre = NULL;                //pre初始为NULL
   if(T!=NULL);{              //非空二叉树才能进行线索化
      PreThread(T);            //先序线索化二叉树
      if(pre->rchild == NULL)
         pre->rtag=1;         //处理遍历的最后一个结点
   }
}


3. 后序线索化

typedef struct ThreadNode{
   int data;
   struct ThreadNode *lchild, *rchild;
   int ltag, rtag;                // 左、右线索标志
}ThreadNode, *ThreadTree;

//全局变量pre, 指向当前访问的结点的前驱
TreadNode *pre=NULL;

//先序遍历二叉树,一边遍历一边线索化
void PostThread(ThreadTree T){
   if(T!=NULL){
      PostThread(T->lchild);
      PostThread(T->rchild);
      visit(T);                  //访问根节点
   }
}

void visit(ThreadNode *q){
   if(q->lchid = NULL){                 //左子树为空,建立前驱线索   
      q->lchild = pre;
      q->ltag = 1;
   }

   if(pre!=NULL && pre->rchild = NULL){ 
      pre->rchild = q;           //建立前驱结点的后继线索
      pre->rtag = 1;
   }
   pre = q;
}

//先序线索化二叉树T
void CreateInThread(ThreadTree T){
   pre = NULL;                //pre初始为NULL
   if(T!=NULL);{              //非空二叉树才能进行线索化
      PostThread(T);            //后序线索化二叉树
      if(pre->rchild == NULL)
         pre->rtag=1;         //处理遍历的最后一个结点
   }
}


中序和后序都已经处理完了左子树,所以用不到lchild,也就不同考虑他的转圈问题

4. 线索树的寻找前驱后继的各种情况(多理解)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

向“数”而“深”,联想凌拓的“破局求变”底气何来?

前言:要赢得更多机遇,“破局求变”尤为重要。 【全球存储观察 | 热点关注】2019年2月25日,承袭联想集团与NetApp的“双基因”,联想凌拓正式成立。历经四年多的发展,联想凌拓已成为中国企业级数据管理领域的…

opencv-29 Otsu 处理(图像分割)

Otsu 处理 Otsu 处理是一种用于图像分割的方法,旨在自动找到一个阈值,将图像分成两个类别:前景和背景。这种方法最初由日本学者大津展之(Nobuyuki Otsu)在 1979 年提出 在 Otsu 处理中,我们通过最小化类别内…

C语言-------函数栈帧的创建和销毁------剖析描骨

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂…

Talk | 新加坡国立大学博士生施宇钧:DragDiffusion-基于扩散模型的关键点拖拽图片编辑

本期为TechBeat人工智能社区第518期线上Talk! 北京时间8月2日(周三)20:00, 新加坡国立大学博士生—施宇钧的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “DragDiffusion-基于扩散模型的关键点拖拽图片编辑”,他…

浅谈机器视觉

目录 1.什么是机器视觉 2.学习机器视觉需要掌握的知识 3.机器视觉的由来 4.机器视觉带来的福利 1.什么是机器视觉 机器视觉(Computer Vision)是人工智能领域中的一个分支,旨在通过模仿人类的视觉系统,使计算机能够理解和解释图…

使用uni-app的uniCloud 云数据库入门:实现一个简单的增删改查

官方云数据库文档 前置步骤使用uni-app新建一个uniCloud项目 [外链图片转存失败,源站可能有防盗官方云数据库文档]!链机制,建议将()https://uniapp.dcloud.net.cn/uniCloud/hellodb.html)] 新建表 这里我加了几个测试字段 createTime、remark、money // 文档教程: https://un…

深度强化实车部署教程

强化學習仿真實車部署 前言 这里讲一下如何部署 有两种方式部署: 第一种实车远程控制:即通过roscore中的IP设置实现远程控制;具体可以参考turtlebot3的PC连接turtlebot3并控制的教程;我使用的是这种方法; 第二种直…

一条命令重启supervisor所有RUNNING状态的进程

supervisorctl status | grep RUNNING | awk {print $1} | xargs -n1 supervisorctl restart

选择适合的项目管理系统,了解有哪些选择和推荐

随着科技的进步和全球竞争的加剧,项目管理已经成为企业成功的关键要素。为了更好地组织和监控项目,许多企业和组织正在采用项目管理系统(PMS)。本文将探讨项目管理系统的主要组成部分以及其在实际应用中的优势。 “项目管理系统有哪些?国际上比较常见的…

GCC版本升高到11.3后编译之前同样的C++代码出现的若干错误

目录 1 gtest-death-test.cc:1301:24: error: ‘dummy’ may be used uninitialized 2 error: ‘void* memcpy(void*, const void*, size_t)’ copying an object of non-trivial type ‘Eigen::internal::Packet4c’ 3 error: comparison is always true due to limited ra…

京东开源的、高效的企业级表格可视化搭建解决方案:DripTable

DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案,项目基于 React 和 JSON Schema,旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目:drip-table、drip-table-gene…

JDK8:Stream流0基础使用与深入理解,Stream流源码分析

文章目录 一、概述二、集合操作演进对比1、JDK7传统方式2、JDK8 使用Stream3、小结 三、流实现思想1、外部迭代2、内部迭代 四、函数式编程五、流操作详解1、流的分类(1)中间操作(2)终止操作 2、构建流(1)基…

元素内容必须由格式正确的字符数据或标记组成

mybatis报错&#xff1a; 元素内容必须由格式正确的字符数据或标记组成 代码&#xff1a; 原因分析&#xff1a; 经过查找&#xff0c;使用 解决方案&#xff1a; 使用<![CDATA[ SQL语句 ]]> 将含有<、>、<、>的sql语句包含进去。 第二种方法&#…

STM32 低功耗学习

STM32 电源系统结构介绍 电源系统&#xff1a;VDDA供电区域、VDD供电区域、1.8V供电区域、后备供电区域。 器件的工作电压&#xff08;VDD&#xff09;2.0~3.6V 为了提高转换精度&#xff0c;给模拟外设独立供电。电压调节器为1.8V供电区域供电&#xff0c;且1.8V供电区域是电…

《MySQL》第十四篇 COUNT(*)和 COUNT(1)的区别

本文旨在介绍COUNT(*&#xff09;&#xff0c;COUNT(1&#xff09;&#xff0c;COUNT(col&#xff09;三者之间区别和使用索引的情况&#xff0c;count() 函数是用来统计行数用的&#xff0c;以下内容均是个人实践模拟结果&#xff0c;仅供参考&#xff1b; 阿里规范中详细描述…

seata 启动报错 Could not create connection to database server

文章目录 报错信息1、驱动包问题2、高版本驱动类名称问题3、url 时区问题4、驱动包位置问题 环境&#xff1a; 操作系统&#xff1a;windows 10seata版本&#xff1a;seata-server-1.6.1数据库版本&#xff1a;mysql 8.0.33 报错信息 seata启动报错com.mysql.jdbc.exception…

流程图如何制作?5步快速画出好看的流程图!

流程图是一种图形化工具&#xff0c;描述某个过程或者操作的步骤&#xff0c;以及某种业务系统的具体流程。流程图通常由各种图形符号、形状、箭头组成&#xff0c;可以清晰的表示出流程或系统中各种步骤、每个环节之间的关系、条件判断、数据的流动和处理过程等。 在线流程图软…

npm install时出现的问题Failed at the node-sass@4.14.1 postinstall script

从阿里云上拉取下来项目后&#xff0c;首先使用npm install 命令进行安装所需依赖&#xff0c;意想不到的事情发生了&#xff0c;报出了Failed at the node-sass4.14.1 postinstall script&#xff0c;这个问题&#xff0c;顿时一脸懵逼&#xff1b;询问前端大佬&#xff0c;给…

斯坦福:小鼠植入人脑组织后继续生长

美国科学家的一项新研究表明&#xff0c;移植到大鼠体内的微型人脑结构可以发送信号&#xff0c;并对大鼠胡须感受到的环境线索作出反应。该研究证明从人类干细胞中生长的神经元可以与活体啮齿动物的神经细胞结合&#xff0c;或可为人类大脑疾病的治疗提供新方法。相关研究结果…

《云管理产品与服务图谱(2023)》发布!MIAOYUN荣登【运维平台】板块

2023年7月25日&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;和中国通信标准化协会联合主办的2023第十届可信云大会在北京召开。大会以“云领创新 算启新篇”为主题&#xff0c;就云计算产业发展现状和趋势等进行了研讨&#xff0c;并发布了《…