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

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

 📝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


      相关文章
      |
      2天前
      |
      C语言
      【数据结构】二叉树(c语言)(附源码)
      本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
      28 8
      |
      1天前
      |
      机器学习/深度学习 JSON 算法
      二叉树遍历算法的应用场景有哪些?
      【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
      5 0
      |
      25天前
      |
      存储 算法 关系型数据库
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
      16 0
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      |
      25天前
      |
      存储 算法 搜索推荐
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
      15 0
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      |
      25天前
      |
      存储 算法
      探索数据结构:分支的世界之二叉树与堆
      探索数据结构:分支的世界之二叉树与堆
      |
      25天前
      |
      存储 算法
      数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
      这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
      21 0
      |
      3天前
      |
      C语言
      【数据结构】栈和队列(c语言实现)(附源码)
      本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
      47 9
      |
      2天前
      |
      存储
      系统调用处理程序在内核栈中保存了哪些上下文信息?
      【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
      21 4
      |
      25天前
      |
      算法 程序员 索引
      数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
      栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
      25 1
      数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
      |
      6天前
      |
      算法 安全 NoSQL
      2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
      数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!