二叉树中序线索化分析
线索二叉树:
对于二叉树来说,其每个结点都配备了两个指针域,但并不是每个结点都有其左孩子结点和右孩子结点。这样一来,对于一个有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是已经创建过的执行访问操作的函数(其可能含有多种功能)}
}
二叉树中序线索化分析相关推荐
- 数据结构-C语言版-二叉树中序线索化
二叉树中的线索化问题,数据结构最核心.密集的考点之一:树,以中序二叉树的线索化 代码参考王道数据结构课程! #include<stdio.h> #include<stdlib.h&g ...
- 二叉树的先序线索化、中序线索化、后序线索化的对比
有一点需要注意:在先序遍历一个节点的左子树时,需要判断其ltag的值是否为0,如果为0可以正常遍历,但是,如果为1就不能进行遍历.因为ltag的值为1说明该结点的左指针指向的是它的前驱结点而不是左孩子 ...
- 【算法系列之线索化二叉树,前序线索化、中序线索化、后序线索化以及遍历~】
1.何谓线索化二叉树 2.线索化二叉树的本质 3.线索化二叉树的存储结构 4.构建线索化二叉树 4.1.先序线索化 4.2.中序线索化 4.3.后序线索化 5.遍历线索化二叉树 5.1.先序遍历 先序 ...
- 线索二叉树原理及前序、中序线索化(Java版)
转载 原文地址:https://blog.csdn.net/UncleMing5371/article/details/54176252 一.线索二叉树原理 前面介绍二叉树原理及特殊二叉树文章中提到, ...
- C语言实现二叉树的中序线索化及遍历中序线索二叉树
C语言实现二叉树的线索化以及如何遍历线索二叉树! 文章目录 线索二叉树的结构及数据类型定义 根据输入结点初始化二叉树 中序遍历二叉树并线索化 遍历中序线索二叉树 项目完整代码 项目完整代码(改进版) ...
- 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树
在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...
- (c语言)二叉树中序线索(数据结构十七)
1.数据类型定义 在代码中为了清楚的表示一些错误和函数运行状态,我们预先定义一些变量来表示这些状态.在head.h头文件中有如下定义: //定义数据结构中要用到的一些变量和类型 #ifndef HEA ...
- 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法
引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...
- 中序线索二叉树的创建、线索化和遍历
[问题描述]创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树 [编码要求]线索二叉树遍历过程中不能使用递归.不能使用栈. [输入形式]二叉树拓展的前序遍历序列 [输出形式] ...
- 二叉树前、中、后线索化及对应前、中、后序线索化遍历
二叉树前中后线索化及对应前中后序线索化遍历(图解) 二叉树线索化都是套路,会一种另外两种只是稍微修改一下代码 值得一提的是后序线索化输出,逆序思维将后序线索化看成前序,采用"前序线索化输出& ...
最新文章
- cordova ios的问题
- WPF中的容器控件——GridSplit
- kafka实战最佳经验,【源码分析设计模式 10
- python 给定URL 如何获取其内容,并将其保存至HTML文档。
- Selenium+phanmJs 操作浏览器 爬取数据
- kafka笔记3(生产者)
- webform 简单的服务器控件。
- Cookie操作以及如何在js中调用jsp变量
- mysql 半同步_mysql 主从同步 与 半同步
- 14 [虚拟化] 虚存抽象;Linux进程的地址空间
- spark学习-63-源代码:schedulerBackend和taskScheduler的创建(1)-local
- mysql ndb 测试_mysql ndb笔记
- Makefile--基本规则(零)
- 关于IPV6审核被拒的完整分析
- oracle技术之浅述当前模式读与一致性读
- 扁平卡通风毕业论文答辩PPT模板
- python爬虫实现大麦抢票_爬虫 大麦网
- 华为p60art参数配置 华为p60art怎么样
- 加密视频(java加密视频)
- HMAC 挑战/响应双向认证