【数据结构与算法】第十二章:线索化二叉树

简介: 在二叉树的一些应用中,常常要求在数中查找具有某种特征的结点,或者是对树中的全部结点逐一进行处理,这就提出了一个遍历二叉树的问题。本章将详细介绍二叉树的存储和遍历。

 📝3️⃣线索化二叉树

      当以二叉链表作为存储结构时,只能找到结点的左、右孩子信息,儿不能直接得到结点在任一序列中的前驱和后继信息,这种信息只有在遍历的动态过程中得到,为此引入线索二叉树来保存这些动态过程中得到的有关前驱和后继的信息。

✨相关概念

普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。若将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快顺藤摸瓜而遍历整个树。

【线索】:指结点前驱和后继的指针。

【线索二叉树】:加上线索额二叉树。

【线索化】:对二叉树以某种次序遍历使其变为线索二叉树的过程。

【线索链表】:加上线索二叉链表。

✨实现方法

通过两种保存前驱和后继的方法:

    1. 利用空链域: 二叉链表n有(n+1)个空链域。
    2. 增加两个域:fwd 和 bwd。

    在线索化二叉树时,若结点有左子树,则lchild指向其左孩子,否则,lchild指向其直接前驱(即线索)。同理,若结点有右子树,则rchild指向其右孩子,否则,rchild指向其直接后继。

    为了避免混淆,增加两个标志域。

    lchild LTag data RTag rchild

    LTag:= 0,lchild指向其左孩子, LTag:= 1,rchild指向其前驱

    同理, RTag:= 0,lchild指向其右孩子, RTag:= 1,rchild指向其后继

    ✨类型定义

    typedef struct BiThrNode
    {
        TElemType data;
        struct BiThNode *lchild,*rchild;//左右孩子指针
        int LTag, RTag;//左右标记
    }BiThrNode,*BiThrNode;

    image.gif

    ✨以结点p为根结点中序线索化

    【算法步骤】

      1. 如果p非空,左子树递归线索化。
      2. 如果p的左孩子为空,则给p加上左线索,将其LTag置为1,让p的左孩子指针指向pre(前驱);否则将p的LTag置为0。
      3. 如果pre的右孩子为空,则给pre加上右线索,将其RTag置为1,让pre的右孩子指针指向p(后继);否则将pre的RTag置为0。
      4. 将pre指向刚访问过的结点p,即pre = p。
      5. 右子树递归线索化。

      【算法描述】

      void InThreading(BiThrTree p) 
      { 
          //pre是全局变址,初始化时其右孩子指针为空,便于在树的最左点开始建线索
          if(p) 
              InThreading (p-> lchild) ;//左子树递归线索化
          if (! p-> lchild) //p的左孩子为空
              p-> LTag=1; //给p加上左线索
              p-> lchild=pre; //p的左孩子指针指向pre(前驱)
          }
          else p->LTag=O; 
          if (! pre-> rchild) //pre的右孩子为空
              pre-> RTag=1; //给pre加上右线索
              pre-> rchld=p; //pre的右孩子指针指向p(后继)
          }
          else p->RTag=O; 
          pre=p; //保持pre指向p的前驱
          InThrending (p-> rchild) ; //右子树递归线索化
      }

      image.gif

      ✨带头结点的二叉树中序线索化

      【算法描述】

      void InOrderThreading(BiThrTree &Thrt,BiThrTree T)
      {
          //中序遍历二叉树T,并将其中序线索化,Thrt指向头结点
          Thrt = new BiThrNode;//建立头结点
          Thrt -> LTag = 0;//头结点有左孩子,若树非空,则其左孩子为树根
          Thrt -> RTag = 1;//头结点的右孩子指针为右线索
          Thrt -> rchild = Thrt;//初始化时右指针指向自己
          if(!T)
              Thrt -> lchild = Thrt;//若树为空,则左指针也指向自己
          else
          {
              Thrt -> lchild = T;//头结点的左孩子指向根
              pre = Thrt;//pre初值指向头结点
              InThreading(T);//对以T为根的二叉树进行中序线索化
              pre -> rchild = Thrt;//线索化完成后,pre为最右节点,pre的右线索指向头结点
              pre -> RTag = 1;
              Thrt -> rchild = pre;//头结点的右线索指向pre
          }
      }

      image.gif


      相关文章
      |
      9天前
      |
      算法
      分享一些提高二叉树遍历算法效率的代码示例
      这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
      |
      12天前
      |
      存储 缓存 算法
      如何提高二叉树遍历算法的效率?
      选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
      34 5
      |
      16天前
      |
      C语言
      【数据结构】二叉树(c语言)(附源码)
      本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
      65 8
      |
      15天前
      |
      机器学习/深度学习 JSON 算法
      二叉树遍历算法的应用场景有哪些?
      【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
      24 0
      |
      1月前
      |
      存储 算法 关系型数据库
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
      20 0
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      |
      1月前
      |
      存储 算法 搜索推荐
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
      23 0
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      |
      1月前
      |
      存储 算法
      探索数据结构:分支的世界之二叉树与堆
      探索数据结构:分支的世界之二叉树与堆
      |
      27天前
      |
      算法 安全 数据安全/隐私保护
      基于game-based算法的动态频谱访问matlab仿真
      本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
      |
      12天前
      |
      算法 数据挖掘 数据安全/隐私保护
      基于FCM模糊聚类算法的图像分割matlab仿真
      本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
      |
      13天前
      |
      算法 调度
      基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
      车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。