【数据结构和算法】线索二叉树

简介: 【数据结构和算法】线索二叉树

利用二叉链表中的空指针域:

  • 如果某个节点的左孩子为空,则将空的左孩子的指针域改为指向其前驱;
  • 如果某个节点的右孩子为空,则将空的右孩子的指针域改为指向其后继;
  • 这种改变指向的指针称为“线索”,加上了线索的二叉树称为线索二叉树,对二叉树按某种遍历次序使其变为线索二叉树的过程叫做线索化。


为区分lchild和rchild指针到底是指向孩子的指针还是指向前驱后继的指针,对二叉链表的每个结点增设两个标识域ltag和rtag,并约定:

  • ltag = 0 lchild指向该节点的左孩子
  • ltag = 1 lchild指向该节点的前驱
  • rtag = 0 rchild指向该节点的右孩子
  • rtag = 1 rchild指向该节点的后继


增加头结点

增加一个头结点

  • ltag = 0,lchild指向根节点
  • rtag = 1,rchild指向遍历序列中最后一个结点
  • 遍历序列中第一个节点的lc域和最后一个结点的rc域都指向头结点,如图所示。
  • image.png
  • 找到了前驱,就可以找到头结点,通过头结点又可以访问到其他的节点;
  • 而当我们找到了最后的一个节点,有可以顺着指针找到头结点再找到其他的节点。


线索二叉树的数据结构

typedef enum{
  link, //表示指向左右孩子的指针
  thread, //表示指向前驱后继的线索
}TreePointTag;
typedef struct TbinaryTree{
  char data;
  struct TbinaryTree *lchild;
  struct TbinaryTree *rchild;
  TreePointTag ltag;
  TreePointTag rtag;
}TbinaryTree;


代码:

//线索二叉树的数据结构
typedef enum{link,thread}PointTag;
typedef struct BiThrNode{
  char data;
  struct BiThrNode *lchild;
  struct BiThrNode *rchild;
  PointTag ltag;
  PointTag rtag;
}BiThrNode,*BiThrTree;
//线索二叉树的创建
BiThrNode* CreateBiThrTree()
{
  BiThrNode* T;
  char c;
  scanf("%c",&c);
  if(' ' == c)
  T = NULL;
  else
  {
  T = (BiThrNode *)malloc(sizeof(BiThrNode));
  T->data;
  T->data = c;
  T->ltag = link;
  T->rtag = link;
  T->lchild = CreateBiThrTree();
  T->rchild = CreateBiThrTree();
  }
  return T;
}
//全局变量,始终指向刚刚访问过的节点
BiThrTree pre;
//中序遍历线索化
InThreading(BiThrTree T)
{
  if(T)
  {
  InThreading(T->lchild); //递归左孩子线索化
  //节点处理,中序和之前遍历树的操作不同,但是结构相同  
  if( !T->lchild)   //如果该节点没有左孩子
  {
    T->ltag = thread; //设置为线索
    T->lchild = pre;  //指向前驱节点,也就是上一个访问的节点
  }
  if( !pre->rchild )  //右子树为空的情况才可以设置线索
  {
    pre->rtag = thread; //设置为线索
    pre->rchild = T;  //指向后继节点,也就是当前访问的节点
  }  
  pre = T;  //处理完当前节点之后,T就成为前一个节点,然后接着往下
  InThreading(T->rchild); //递归右孩子线索化
  }
}
//增加头结点并对pre进程初始化
InOrderThreading(BiThrTree head,BiThrTree T)
{
  head = (BiThrTree)malloc(sizeof(BiThrTree));
  head->ltag = link;
  head->rtag = thread;
  head->rchild = head;  //指向本身
  if( !T )  //如果为空树
  head->lchild = head;
  else  //如果不是空树
  {
  head->lchild = T;
  pre = head;  //对pre进行初始化
  InThreading(T); //中序遍历线索化
  //收尾处理
  pre->rchild = head;
  pre->rtag = thread;
  head->rchild = pre;
  }
}
//中序遍历二叉树,非递规
void InOrderTraverse(BiThrTree T)
{
  BiThrTree p;
  p = T->lchild;
  while( p != T )
  {
  while( p->ltag == link )
    p = p->lchild;
  printf("%c",p->data);
  while(p->rtag == thread && p->rchild != T)
  {
    P = P->rchild;
    printf("%c",p->data);
  }
  p = p->rchild;  //指回头结点
  }
}


参考链接:https://www.bilibili.com/video/av35340088

目录
相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
73 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
13天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
16天前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
42 5
|
21天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
71 8
|
19天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
24 0
|
1月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
34 4
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
24 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
1月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆
|
1月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
下一篇
无影云桌面