我们知道,当以二叉链表作为存储结构时,只能找到结点的左、右孩子信息,而不能直接得到结点在任一序列中的前驱和后继信息。

做下面规定:若结点有左子树,则其lchild指示其左孩子,否则令lchild域指示其前驱;若结点有右子树,则其rchild域指示其右孩子,否则rchild域指示其后继。这样我们增加两个标志域(如下图所示)

这种结构就是先是链表,对应的树就是线索二叉树。

这个有什么用呢?

我们举个例子。

比如,下面的这个树:

这个图里面:我们如果用先序遍历为:ABDHIECFG但是我们看到这个H,I,E,F,G他们的左右孩子都为空,

但我们把他中序遍历后为HDIBEAFCG,我们可以看到他们刚刚好,H,I,E,F,G他们的左右孩子都为空。但他们恰好可以用这个放他们的前驱或后继。

这就是线索二叉树的好处。。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>typedef char ElemType;//线索存储标志位
//Link(0):表示指向左右孩子的指针
//Thread(1):表示指向前驱后继的线索
typedef enum{Link,Thread} PointerTag;typedef struct BitThrNode
{char data;struct BitThrNode *lchild, *rchild;PointerTag ltag;  //标志左孩子PointerTag rtag; //标志右孩子
}BiThrNode,*BiThrTree;//全局变量始终指向刚刚访问过的节点
BiThrTree pre;//创建一颗二叉树,按照前序遍历方式输入
void CreateBiThrTree(BiThrTree *T)
{char c;scanf_s("%c", &c);if ('$' == c){*T = NULL;}else{*T = (BiThrNode*)malloc(sizeof(BiThrNode));(*T)->data = c;(*T)->ltag = Link;(*T)->rtag = Link;CreateBiThrTree(&(*T)->lchild);CreateBiThrTree(&(*T)->rchild);}}//中序遍历线索化
void InThreading(BiThrTree T)
{if (T){InThreading(T->lchild);      //递归左孩子线索化//结点处理if (!T->lchild)      //如果该结点没有左孩子,设置ltag为Thread,并把lchild指向刚刚访问的结点。{T->ltag = Thread;T->lchild = pre;}if (!pre->rchild){pre->rtag = Thread;pre->rchild = T;}pre = T;InThreading(T->rchild);      //递归右孩子线索化}
}void InOrderThreading(BiThrTree *p,BiThrTree T)
{*p = (BiThrTree)malloc(sizeof(BiThrNode));(*p)->ltag = Link;(*p)->rtag = Thread;(*p)->rchild = *p;if (!T){(*p)->lchild = *p;}else{(*p)->lchild = T;pre = *p;InThreading(T);pre->rchild = *p;pre->rtag = Thread;(*p)->rchild = pre;}
}void visit(char c)
{printf_s("%c", c);
}//中序遍历二叉树,非递归
void InOrderTraverse(BiThrTree T)
{BiThrTree p;p = T->lchild;while (p != T){while (p->ltag == Link){p = p->lchild;}visit(p->data);while (p->rtag == Thread && p->rchild != T){p = p->rchild;visit(p->data);}p = p->rchild;}
}int main()
{BiThrTree P, T = NULL;CreateBiThrTree(&T);InOrderThreading(&P, T);printf_s("中序遍历输出结果为:");InOrderTraverse(P);printf_s("\n");system("pause");return 0;
}

下面是运行结果:

6.3.2线索二叉树相关推荐

  1. 数据结构与算法(6-4)线索二叉树

    优势:便于在中序遍历下,查找前驱和后继. 前驱/后继含义:AB中,A是B前驱,B是A后继. ltag=0时:lchild指向左孩子                ltag=1时:lchild指向前驱 ...

  2. 重拾算法(3)——用458329个测试用例全面测试二叉树和线索二叉树的遍历算法

    重拾算法(3)--用458329个测试用例全面测试二叉树和线索二叉树的遍历算法 在"上一篇"和"上上一篇"中,我给出了二叉树和线索二叉树的遍历算法.给出算法容易 ...

  3. 线索二叉树代码实现 - 数据结构和算法49

    线索二叉树代码实现 让编程改变世界 Change the world by program   程序参考代码:http://bbs.fishc.com/forum-112-1.html [buy] 获 ...

  4. 线索二叉树(c/c++)

    线索二叉树 定义: 对于n个结点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树. 特 ...

  5. 【线索二叉树详解】数据结构06(java实现)

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

  6. 线索二叉树原理及前序、中序线索化(Java版)

    转载 原文地址:https://blog.csdn.net/UncleMing5371/article/details/54176252 一.线索二叉树原理 前面介绍二叉树原理及特殊二叉树文章中提到, ...

  7. 【数据结构-树】2.二叉树遍历与线索二叉树(图解+代码)

    一.二叉树的定义及其主要特征 1.1 二叉树的概念 二叉树是另一种树形结构,其特点是每个结点最多含两棵子树(也就是说,二叉树的度≤2). 二叉树是一种有序树,若将其左.右子树颠倒,则成为另一颗不同的二 ...

  8. 为什么说线索二叉树是一种物理结构

    1 数据结构三要素中的两个要素分别为 数据的逻辑结构 数据的存储结构,也称物理结构 它们的精确定义是: 数据的逻辑结构 数据元素之间的逻辑关系,与数据的存储无关. 数据的存储结构 数据结构在计算机中的 ...

  9. 线索二叉树(基于链表存储树结点)

    有以下场景 如果使用中序遍历,那么得到的顺序是:HDIBEAFCG,可以得知A的前驱结点为E,后继结点为F.但是,这种关系的获得是建立在完成遍历后得到的.如果我们每次想得到某个节点的前驱或者后继,都要 ...

  10. 我这么讲线索二叉树,我三岁大的表弟笑了笑

    目录: 1.线索二叉树的由来 2.线索二叉树的概念和结构 3.二叉树的线索化 4.中序线索二叉树的代码实现 5.遍历线索二叉树 1.线索二叉树的由来 我问表弟下面的一个问题: 在n个结点一个二叉链表中 ...

最新文章

  1. 4-20模块 序列化模块 hashlib模块
  2. 如何设计好词袋模型BoW模型的类类型
  3. AJAX——基于请求加载数据
  4. matlab计算联合熵,如何用matlab软件计算一幅图像信息的熵以及两幅图像间的联合熵?...
  5. Centos yum 安装JDK及配置环境变量
  6. java实现多表增加_java多表插入数据
  7. 安装 PostgreSQL 时丢失 libintl-8.dll 解决方案
  8. 大学物理光学思维导图_思维导图真的需要学吗?(附资料)
  9. 安卓手机通过抓包实现钉钉网课刷赞
  10. 标准HTML代码框架解析
  11. 关于小米Ruby15.6笔记本驱动黑苹果博通蓝牙的补充
  12. Android获取半透明属性
  13. 计算机组装与维护致谢,浅谈计算机组装与维护的教学改革-毕业论文致谢
  14. 你用过猿如意吗?猿如意可以使用ChatGPT哦,这里详细介绍了猿如意的功能,为什么我建议你使用猿如意,来看看吧
  15. 【论文阅读】Self-Knowledge Distillation with Progressive Refinement of Targets
  16. 【个人随笔】留下第一个脚印
  17. Linux服务器卡顿如何排查
  18. 算法---逆向旋转矩阵法求解矩阵绕圈走
  19. IPFS/FIL10月15日迎来又一轮减产 对投资者有什么影响?
  20. C语言面试篇(一)总结

热门文章

  1. 出差在外,无法随时随地查看报表?那是因为你还不知道移动端报表
  2. 浅析数据库设计三范式
  3. 杨元庆:出身中国是联想吸引国际用户的障碍
  4. 惩罚女人的最有效方法!
  5. 程序员网上晒出新同事与老同事一起吃饭的照片,太搞笑
  6. 经典面试题(10):关于this指向,以下代码将输出什么?
  7. HTML5科普知识:细数HTML5新增标签
  8. 目标群体是什么意思_抖音代运营日常主要是做什么的?
  9. pascal和python的区别_Python如何与其他编程语言不同
  10. pytorch中CrossEntropyLoss和NLLLoss的区别与联系