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

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

 📝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


      相关文章
      |
      1天前
      |
      存储 算法 Python
      文件管理系统中基于 Python 语言的二叉树查找算法探秘
      在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
      33 5
      |
      1天前
      |
      数据库
      数据结构中二叉树,哈希表,顺序表,链表的比较补充
      二叉搜索树,哈希表,顺序表,链表的特点的比较
      数据结构中二叉树,哈希表,顺序表,链表的比较补充
      |
      1月前
      |
      机器学习/深度学习 存储 算法
      数据结构实验之二叉树实验基础
      本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
      85 4
      |
      1月前
      |
      算法
      分享一些提高二叉树遍历算法效率的代码示例
      这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
      |
      1月前
      |
      存储 缓存 算法
      如何提高二叉树遍历算法的效率?
      选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
      60 5
      |
      1月前
      |
      C语言
      【数据结构】二叉树(c语言)(附源码)
      本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
      132 8
      |
      1月前
      |
      机器学习/深度学习 JSON 算法
      二叉树遍历算法的应用场景有哪些?
      【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
      47 0
      |
      2月前
      |
      存储 算法 关系型数据库
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
      32 0
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      |
      2月前
      |
      存储 算法 搜索推荐
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
      37 0
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      |
      2月前
      |
      存储 算法
      探索数据结构:分支的世界之二叉树与堆
      探索数据结构:分支的世界之二叉树与堆