线索二叉树:
对于二叉树来说,其每个结点都配备了两个指针域,但并不是每个结点都有其左孩子结点和右孩子结点。这样一来,对于一个有n个
结点的二叉树来说,其指针域有2n个,而其分支有n-1条,这些分支将会指向其特定的一一对应的指针域,故空闲的指针域为 2n-(n-1)=n+1个。
这样对于二叉树结构来说是一种极大的浪费。故我们可以用线索化的方式将其利用起来。

线索化方法:对于每一个结点,多增加两个标识域ltag和rtag。
(1)如果ltag=0,则表示lchild为指针,指向结点的左孩子;如果ltag=1,则表示lchild为线索,指向结点的直接前驱
(2)如果rtag=0,则表示rchild为指针,指向结点的右孩子;如果rtag=1,则表示rchild为线索,指向结点的直接后继


//对应的线索二叉树结点定义如下:
typedef struct TBTNode
{char data;int ltag, rtag;struct TBTNode* lchild;struct TBTNode* rchild;
}TBTNode;//以中序遍历为例,通过中序遍历对二叉树线索化的递归算法如下:
void InThread(TBTNode* p, TBTNode*& pre)
{if (p != NULL){InThread(p->lchild, pre);//递归,左子树线索化if (p->lchild == NULL){p->lchild = pre;p->ltag = 1;}if (pre != NULL && pre->rchild == NULL){pre->rchild = p;p->rtag = 1;}pre = p;p = p->rchild;InThread(p, pre);}
}//通过中序遍历建立中序线索二叉树的主程序如下:
void createInThread(TBTNode* root)
{TBTNode* pre = NULL;if (root != NULL){InThread(root, pre);//对非空二叉树进行线索化pre->rchild = NULL;//对于中序遍历的最后一个结点单独处理pre->rtag = 1;}
}//以上完成了二叉树的线索化以及中序线索二叉树的建立,接下来我们来看看它在遍历操作中的应用//(1)求以p为根的中序线索二叉树中,中序序列下的第一个结点
TBTNode* First(TBTNode* p)
{while (p->ltag == 0)//当当前结点一直存在左孩子结点,则p将不断指向其左孩子结点,直到ltag==1{p = p->lchild;}return p;
}
//(2)求在中序线索二叉树中,结点p在中序下的后继结点的算法
TBTNode* Next(TBTNode* p)
{if (p->rtag == 0)   //当p有右孩子结点时,有两种情况,第一种:若其右孩子结点并非叶子结点,这样的话我们可以利用刚刚return First(p->rchild);//创立的First函数求出以r->child为根结点的中序序列下的第一个结点,该结点同样也是p的直接后继结点elsereturn p->rchild;//但是如果p没有右孩子结点,那么p->rchild为线索,会直接指向其后继结点
}
//最后可以很容易写出在中序线索二叉树上执行中序遍历的算法
void Inorder(TBTNode* root)
{for (TBTNode* p = First(root); p != NULL; p = Next(p))//从以root为根结点开始中序遍历的第一个元素开始,用p=Next(p)使得其一直指向其直接后继,直到遍历完成为止{//Visit(p);假设p是已经创建过的执行访问操作的函数(其可能含有多种功能)}
}

二叉树中序线索化分析相关推荐

  1. 数据结构-C语言版-二叉树中序线索化

    二叉树中的线索化问题,数据结构最核心.密集的考点之一:树,以中序二叉树的线索化 代码参考王道数据结构课程! #include<stdio.h> #include<stdlib.h&g ...

  2. 二叉树的先序线索化、中序线索化、后序线索化的对比

    有一点需要注意:在先序遍历一个节点的左子树时,需要判断其ltag的值是否为0,如果为0可以正常遍历,但是,如果为1就不能进行遍历.因为ltag的值为1说明该结点的左指针指向的是它的前驱结点而不是左孩子 ...

  3. 【算法系列之线索化二叉树,前序线索化、中序线索化、后序线索化以及遍历~】

    1.何谓线索化二叉树 2.线索化二叉树的本质 3.线索化二叉树的存储结构 4.构建线索化二叉树 4.1.先序线索化 4.2.中序线索化 4.3.后序线索化 5.遍历线索化二叉树 5.1.先序遍历 先序 ...

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

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

  5. C语言实现二叉树的中序线索化及遍历中序线索二叉树

    C语言实现二叉树的线索化以及如何遍历线索二叉树! 文章目录 线索二叉树的结构及数据类型定义 根据输入结点初始化二叉树 中序遍历二叉树并线索化 遍历中序线索二叉树 项目完整代码 项目完整代码(改进版) ...

  6. 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...

  7. (c语言)二叉树中序线索(数据结构十七)

    1.数据类型定义 在代码中为了清楚的表示一些错误和函数运行状态,我们预先定义一些变量来表示这些状态.在head.h头文件中有如下定义: //定义数据结构中要用到的一些变量和类型 #ifndef HEA ...

  8. 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法

    引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...

  9. 中序线索二叉树的创建、线索化和遍历

    [问题描述]创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树 [编码要求]线索二叉树遍历过程中不能使用递归.不能使用栈. [输入形式]二叉树拓展的前序遍历序列 [输出形式] ...

  10. 二叉树前、中、后线索化及对应前、中、后序线索化遍历

    二叉树前中后线索化及对应前中后序线索化遍历(图解) 二叉树线索化都是套路,会一种另外两种只是稍微修改一下代码 值得一提的是后序线索化输出,逆序思维将后序线索化看成前序,采用"前序线索化输出& ...

最新文章

  1. cordova ios的问题
  2. WPF中的容器控件——GridSplit
  3. kafka实战最佳经验,【源码分析设计模式 10
  4. python 给定URL 如何获取其内容,并将其保存至HTML文档。
  5. Selenium+phanmJs 操作浏览器 爬取数据
  6. kafka笔记3(生产者)
  7. webform 简单的服务器控件。
  8. Cookie操作以及如何在js中调用jsp变量
  9. mysql 半同步_mysql 主从同步 与 半同步
  10. 14 [虚拟化] 虚存抽象;Linux进程的地址空间
  11. spark学习-63-源代码:schedulerBackend和taskScheduler的创建(1)-local
  12. mysql ndb 测试_mysql ndb笔记
  13. Makefile--基本规则(零)
  14. 关于IPV6审核被拒的完整分析
  15. oracle技术之浅述当前模式读与一致性读
  16. 扁平卡通风毕业论文答辩PPT模板
  17. python爬虫实现大麦抢票_爬虫 大麦网
  18. 华为p60art参数配置 华为p60art怎么样
  19. 加密视频(java加密视频)
  20. HMAC 挑战/响应双向认证

热门文章

  1. 磁芯电流探头降额功率的主要原因是什么?
  2. Linux命令——timeout
  3. vissim交通仿真实验(1)--仿真基础
  4. composer 安装php 扩展,composer 服务器安装扩展失败怎么办
  5. Cypress 前端测试工具的基本使用和相关命令总结
  6. JS截取视频靓丽的帧作为封面
  7. CTF线下攻防赛总结
  8. ESD与EOS的区别
  9. 不属于计算机系统的输出设备,不是电脑的输出设备的是什么
  10. 解析一个PHP木马,PHP文件上传安全检测组件