c语言实现二叉树的线索化和线索二叉树的遍历
时构建线索二叉树的结构体
线索二叉树比平常的二叉树多了一个ltag域和一个rtag域,他们的作用在后面遍历时会说
#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct btnode {datatype data;btnode* lchild; //二叉树的左孩子指针域btnode* rchild; //二叉树的右孩子指针域int LTag,RTag; //左右Tag值
}btnode;
typedef struct binarytree {btnode* root;
}binarytree;
进行二叉树的线索化之前先建立一颗二叉树
构造空树的函数:
void nulltree(binarytree* bt) {bt->root = NULL;
}
建立一颗二叉树的函数;
btnode* newnode(btnode* node, datatype x) { //给结点赋值函数node = (btnode*)malloc(sizeof(btnode));node->data = x;return node;
}
binarytree* maketree(binarytree* bt, datatype x, binarytree* lt, binarytree* rt) {bt->root = newnode(bt->root, x); //给二叉树的根节点赋值bt->root->lchild = lt->root;bt->root->rchild = rt->root;return bt;
}
main函数中建立一颗正常的二叉树bt1
int main() {binarytree bt1, bt2, bt3, bt4, bt5;nulltree(&bt5);maketree(&bt4, 'D', &bt5, &bt5);maketree(&bt3, 'C', &bt4, &bt5);maketree(&bt2, 'B', &bt5, &bt5);maketree(&bt1, 'A', &bt2, &bt3);return 0;
}
现在进行二叉树的线索化,二叉树的线索化实质是二叉树的遍历。
左右tag域的作用:二叉树按照某种顺序遍历后得到的一个顺序结构,遍历后的结果中如果结点的左孩子为空,则把ltag置为1,同时该结点的lchild指向该结点的前驱,同理,结点的右孩子为空,则把rtag置为1,同时rchild指向该结点的的后继,若结点的左右孩子都不为空,则ltag=0,rtag=0,这里有两个特殊的结点,则是第一个结点和最后一个结点,若第一个结点的左孩子为空,则它的lchild可以指向一个NULL的前驱结点,若最后一个结点的右孩子为空,则它可以指向一个NULL的后继结点
例子:
bt1中序遍历结果为:BADC,B是遍历结果的第一个结点,B结点的左右孩子均为空,此时B结点有一个后继结点D,由于B结点是第一个结点,且B结点的左孩子为空,所以可以看作B结点也有一个前驱结点NULL结点,此时将B结点的ltag域置为1,同时B的lchild指针域指向NULL结点,B结点的rtag置为1,同时B的rchild指向他的后继结点A,A结点左右孩子均不为空,所以将A结点的左右tag值置为0,D结点的左右孩子均为空,遍历结果他有一个前驱结点A,所以他的ltag=1,lchild指向A结点,他还有一个后继结点C,所以他的rtag=1,rchild指向他的后继结点C,遍历结果的最后一个结点C左孩子不为空,但右孩子为空,所以他的ltag=0,rtag=1,rchild指向一个NULL的后继结点
以上的过程就是二叉树的线索化
btnode*pre=NULL; //设置一个全局变量pre//pre意义为当前结点的前驱结点,p为当前结点
void inthread(btnode*p){ if(p){ //线索化左子树inthread(p->lchild);if(p->lchild==NULL){p->LTag=1;p->lchild=pre;}if(pre!=NULL&&pre->rchild==NULL){pre->RTag=1;pre->rchild=p;}pre=p; 把当前结点赋值给preinthread(p->rchild); //线索化右子树}
}
void inthreadtree(binarytree*bt){ //二叉树的线索化函数 inthread(bt->root);
}
接下来是线索化二叉树的遍历:
void inordertree(binarytree*bt){btnode*p=bt->root;if(p){while(p->lchild){ //遍历最左结点p=p->lchild;} while(p->RTag==1){ //根据线索RTag访问后继结点直到访问到根节点printf("%c",p->data);p=p->rchild;}printf("%c",p->data); //访问根节点while(p->rchild){p=p->rchild;}while(p->lchild&&p->lchild!=bt->root){ //访问右子树的最右结点的最左结点p=p->lchild;}while(p){printf("%c",p->data); p=p->rchild;}printf("\n");}
}
main函数:
int main() {binarytree bt1, bt2, bt3, bt4, bt5;nulltree(&bt5);maketree(&bt4, 'D', &bt5, &bt5);maketree(&bt3, 'C', &bt4, &bt5);maketree(&bt2, 'B', &bt5, &bt5);maketree(&bt1, 'A', &bt2, &bt3);inthreadtree(&bt1);inordertree(&bt1);return 0;
}
源码在此:https://blog.csdn.net/hypnumberone/article/details/124233555
c语言实现二叉树的线索化和线索二叉树的遍历相关推荐
- 二叉树线索化示意图_二叉树的线索化
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历.二叉树作为存储结构时,一个节点只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继.为了保存这种在 ...
- 线索二叉树和中序非递归遍历线索化后的二叉树
//线索二叉树 #include<stdio.h> #include<malloc.h> #include<process.h> #define OVERFLOW ...
- 二叉树线索化示意图_二叉树的线索化算法思想详解
二叉树的线索化,这几天以来我很难掌握,今天终于想通了,哈哈,首先我们来看看二叉树线索化之后会变成什么样子,这里我们以图中的二叉树为例,图如下: 画的太糙,各位看官讲究着看吧- -.所谓二叉树的线索化, ...
- 二叉树线索化示意图_二叉树线索化
程序代码: 1 #include 2 using namespacestd;3 typedef enum 4 {5 LINK,6 THREAD7 }PointerTag;8 template 9 st ...
- 二叉树线索化(C语言)
二叉树线索化 前言: 二叉树线索化主要是将二叉树按遍历的顺序存放于链表中,生成一个特定顺序的链表,访问该链表相当于遍历二叉树,此操作可便于在遍历的每一次操作中,可获取当前结点前驱或后继结点的数据信息 ...
- C语言实现二叉树线索化
#include <stdio.h> #include <stdlib.h>/** * 线索二叉树,实质是遍历一次二叉树 */typedef struct ThreadNode ...
- 线索二叉树原理及前序、中序线索化(Java版)
转载 原文地址:https://blog.csdn.net/UncleMing5371/article/details/54176252 一.线索二叉树原理 前面介绍二叉树原理及特殊二叉树文章中提到, ...
- 数据结构 5-3-3 二叉树的线索化
一.概念 传统的二叉树,只表示出了二叉树的父子关系,而缺少一种线性的联系,因此引入了二叉线索树,以便加快查找前缀和后继的速度,主要是利用二叉树中没有利用到的节点指针.如果指针没有指向节点,就让左向指针 ...
- 线索二叉树(前中后序线索化/遍历/画线索)
线索二叉树 文章目录 线索二叉树 1 线索二叉树的基本概念 2 线索二叉树的构造 2.1 线索二叉树的存储结构 2.2 给线索二叉树画线索 2.2.1 中序 2.2.2 先序 2.2.3 后序 2.3 ...
最新文章
- Docker安全加固——利用LXCFS增强docker容器隔离性和资源可见性
- python支持的数据类型list_Python基本数据类型之list
- P2344 奶牛抗议
- jquery 中后代遍历之children、find区别
- PAZU 是4Fang 为配合“四方在线”软件于2004年开发的WEB打印控件,适用于各种WEB软件项目的打印。...
- ASP.NET 4.0升级至ASP.NET 4.5需要注意的地方
- uni-app的列表搜索框_微信怎么搜索小程序?小程序能有什么用?
- JavaScript学习——判断数据类型总结(转)
- 智能优化算法(源码)-飞蛾扑火优化算法(MFO)
- eclipse中遇到的小问题
- V20西门子变频器怎么选型
- Excel实用技巧辞典 01
- 二行代码解决全部网页木马(含iframe/script木马)
- Nature Microbiology | 可感染阿斯加德古菌的六种深海沉积物中的病毒基因组
- php error_reporting 无效,PHP error_reporting 很不理解。。。
- 求助做过笔记本ec的大佬
- Android进阶之光 读书笔记
- [蓝桥杯]2020年第十一届省赛真题C/C++ B组(七月)
- 在Linux终端命令行下播放音乐的命令
- 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录
热门文章
- 京东云给新建空间添加用户权限,并在jmr中通过linux/hadoop命令查看对应的文件信息
- 用木桶装itil,itilv1~itil4的演变
- Mac启动Openfire时提示“系统偏好设置错误”
- java修改图章图片_Java 处理PDF图章(印章)——图片图章、动态图章
- 天文学家对外星文明的分类如何指导我们探索AI?
- fotf matlab,分数阶matlab工具箱
- sql server2008调试存储过程的完整步骤
- Python函数基础教程-张明阳-专题视频课程
- win10 1050显卡torch调用不到GPU问题处理
- 去除select下拉框默认样式