#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//二叉树链式存储
typedef char DataType;
/*二叉树的二叉链表结点结构定义*/
typedef struct Node//结点结构
{DataType data;//结点数据struct Node * LChild;//左孩子指针struct Node * RChild;//右孩子指针int Ltag;//左标记位int Rtag;//右标记位
}BiTNode, * BiTree;
BiTree pre = NULL;//pre始终指向刚访问过的结点,其初值为NULL
//采用中序遍历进行线索化
void Inthread(BiTree root)/* 对root所指的二叉树进行中序线索化,其中全局变量pre始终指向刚访问过的结点,其初值为NULL*/
{ if(root != NULL){Inthread(root->LChild); /* 线索化左子树 */if(root->LChild==NULL){root->Ltag=1;root->LChild=pre;/*置前驱线索 */}if(pre != NULL&& pre->RChild == NULL) {pre->Rtag=1;pre->RChild=root ;/*置后继线索 */ }pre=root;Inthread(root->RChild); /*线索化右子树*/}
} /*在中序线索树中找结点前驱*/
BiTree InPre(BiTree p)//在中序线索二叉树中查找p的中序前驱,并用pre指针返回结果
{BiTree Pre;if(p->Ltag==1) Pre = p->LChild;//直接利用线索else//在p的左子树中查找“最右下端”结点{for(Pre=p->LChild;Pre->Rtag!=1;Pre=Pre->RChild)//不能写Pre->Rtag==0;}return Pre;
}
/*在中序线索树中找结点后继*/
BiTree InNext(BiTree p)//在中序线索二叉树中查找p的中序后继结点,并用Next指针返回结果
{BiTree Next;if(p->Rtag==1 || p->RChild==NULL)//直接利用线索(注意:一定要加上p->RChild==NULL,不然在调用TInOrder(T)时,程序会停不下来)Next = p->RChild;else//在p的右子树中查找“最左下端”结点{for(Next=p->RChild;Next->Ltag!=1;Next=Next->LChild)//不能写Next->Ltag==0;}return Next;
}
/*在中序线索树上求中序遍历的第一个结点*/
BiTree InFirst(BiTree Bt)
{BiTree p = Bt;if(!p) return NULL;while(p->Ltag!=1) p = p->LChild;return p;
}
/*遍历中序二叉线索树*/
void TInOrder(BiTree Bt)
{BiTree p;p = InFirst(Bt);while(p){printf("%c",p->data);p = InNext(p);}
}
/*用扩展先序遍历序列创建二叉链表*/
void CreateBiTree(BiTree * bt)//这边的bt是指针的指针
{char ch;ch = getchar();if(ch=='#') *bt = NULL;else{*bt = (BiTree)malloc(sizeof(BiTNode));//用(*bt)指针开辟结点空间(*bt)->data = ch;CreateBiTree( &( (*bt)->LChild) );CreateBiTree( &( (*bt)->RChild) );}
}int main()
{BiTree T;//开辟一个指向树的T指针CreateBiTree(&T);//传址建树Inthread(T);//建立中序线索树printf("%c\n",InFirst(T)->data);//在中序线索树上求中序遍历的第一个结点printf("%c\n",InPre(T)->data);//在中序线索树中找结点前驱printf("%c\n",InNext(T)->data);//在中序线索树中找结点后继TInOrder(T);//遍历中序二叉线索树return 0;
}

二叉树线索化-调通-简单相关推荐

  1. 二叉树线索化示意图_二叉树的线索化算法思想详解

    二叉树的线索化,这几天以来我很难掌握,今天终于想通了,哈哈,首先我们来看看二叉树线索化之后会变成什么样子,这里我们以图中的二叉树为例,图如下: 画的太糙,各位看官讲究着看吧- -.所谓二叉树的线索化, ...

  2. 数据结构二叉树线索化

      线索化二叉树指的是将二叉树中的结点进行逻辑意义上的"重排列",使其可以线性的方式访问每一个结点.二叉树线索化之后每个结点都有一个线性下标,通过这个下标可以快速访问结点,而不需要 ...

  3. 二叉树线索化(C语言)

    二叉树线索化 前言: 二叉树线索化主要是将二叉树按遍历的顺序存放于链表中,生成一个特定顺序的链表,访问该链表相当于遍历二叉树,此操作可便于在遍历的每一次操作中,可获取当前结点前驱或后继结点的数据信息 ...

  4. C语言实现二叉树线索化

    #include <stdio.h> #include <stdlib.h>/** * 线索二叉树,实质是遍历一次二叉树 */typedef struct ThreadNode ...

  5. 二叉树线索化示意图_二叉树的线索化

    二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历.二叉树作为存储结构时,一个节点只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继.为了保存这种在 ...

  6. 数据结构—二叉树线索化(线索化的先序、中序、后序遍历)

    1.线索二叉树基本概念 二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历.用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序 ...

  7. 二叉树线索化仍不能解决的两个问题及原因

    线索二叉树 结点结构定义如下: 若结点有左子树,则LChild域仍指向其左孩子; 否则,LChild域指向其某种遍历序列中的直接前驱结点. 若结点有右子树,则RChild域仍指向其右孩子; 否则,RC ...

  8. 线索二叉树(线索链表遍历,二叉树线索化)

    一,基本概念 线索二叉树,即在二叉链表的基础上,将二叉链表的空指针域指向其前驱节点和后继节点 线索:将二叉链表中的空指针域指向前驱结点和后继结点的指针被称为线索 线索化:使二叉链表中结点的空链域存放其 ...

  9. 二叉树线索化示意图_103-线索化二叉树思路图解

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

最新文章

  1. 科大讯飞拟募资36亿,要搞什么大事?
  2. linux shell date 日期格式转换
  3. 拖动无标题栏的窗体,需要处理的三个事件
  4. Python学习笔记:常用内建模块4:hmac
  5. 策略模式-Golang实现
  6. 【计算机科学基础】计算机概述
  7. 51CTO-redis-集群安装以及动态扩容
  8. 京东进一步回应“承兴事件”:歌斐自身存在风控缺陷
  9. 利用脚本启动java程序
  10. 使用HslCommunication实现PLC数据的远程客户端监视,以及web端实时监视,远程操作设备示例...
  11. LIve Writer图片自动水印,自动居中,自动为原始大小的设置方法.
  12. html开发列表搜索,前端实例练习 - 可搜索列表
  13. 拓端tecdat|R语言对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归
  14. Python:批量爬取下载中国知网(CNKI)PDF论文
  15. 阿里开源共享:IDE导入阿里编码规约格式化模板和注释模板
  16. 数据库程序中按关键字查询代码
  17. 终端应用变身文件 MD5/SHA1 校验工具
  18. android修改文件名,android 修改文件名称
  19. 记-玩吧-一次失败的面试
  20. 【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

热门文章

  1. 从微信错误报告窥探个人隐私
  2. 高中计算机教师招聘面试题,2020下高中信息技术教师资格证面试试题及答案【1月10日下午】...
  3. POJ4001-模拟象棋
  4. 机器学习:Kmeans
  5. 《EMBEDDING AND BEAMFORMING: ALL-NEURAL CAUSAL BEAMFORMER FORMULTICHANNEL SPEECH ENHANCEMENT》论文阅读
  6. 《雄霸天下》者,圣女也
  7. Golang学习笔记08 链表
  8. 基于柯西变异的蚁狮优化算法 - 附代码
  9. 斯拉《引力动态理论》 超越爱因斯坦(转)
  10. springboot报错Invalid bound statement (not found) 的解决办法