时构建线索二叉树的结构体

线索二叉树比平常的二叉树多了一个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语言实现二叉树的线索化和线索二叉树的遍历相关推荐

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

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

  2. 线索二叉树和中序非递归遍历线索化后的二叉树

    //线索二叉树 #include<stdio.h> #include<malloc.h> #include<process.h> #define OVERFLOW ...

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

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

  4. 二叉树线索化示意图_二叉树线索化

    程序代码: 1 #include 2 using namespacestd;3 typedef enum 4 {5 LINK,6 THREAD7 }PointerTag;8 template 9 st ...

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

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

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

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

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

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

  8. 数据结构 5-3-3 二叉树的线索化

    一.概念 传统的二叉树,只表示出了二叉树的父子关系,而缺少一种线性的联系,因此引入了二叉线索树,以便加快查找前缀和后继的速度,主要是利用二叉树中没有利用到的节点指针.如果指针没有指向节点,就让左向指针 ...

  9. 线索二叉树(前中后序线索化/遍历/画线索)

    线索二叉树 文章目录 线索二叉树 1 线索二叉树的基本概念 2 线索二叉树的构造 2.1 线索二叉树的存储结构 2.2 给线索二叉树画线索 2.2.1 中序 2.2.2 先序 2.2.3 后序 2.3 ...

最新文章

  1. Docker安全加固——利用LXCFS增强docker容器隔离性和资源可见性
  2. python支持的数据类型list_Python基本数据类型之list
  3. P2344 奶牛抗议
  4. jquery 中后代遍历之children、find区别
  5. PAZU 是4Fang 为配合“四方在线”软件于2004年开发的WEB打印控件,适用于各种WEB软件项目的打印。...
  6. ASP.NET 4.0升级至ASP.NET 4.5需要注意的地方
  7. uni-app的列表搜索框_微信怎么搜索小程序?小程序能有什么用?
  8. JavaScript学习——判断数据类型总结(转)
  9. 智能优化算法(源码)-飞蛾扑火优化算法(MFO)
  10. eclipse中遇到的小问题
  11. V20西门子变频器怎么选型
  12. Excel实用技巧辞典 01
  13. 二行代码解决全部网页木马(含iframe/script木马)
  14. Nature Microbiology | 可感染阿斯加德古菌的六种深海沉积物中的病毒基因组
  15. php error_reporting 无效,PHP error_reporting 很不理解。。。
  16. 求助做过笔记本ec的大佬
  17. Android进阶之光 读书笔记
  18. [蓝桥杯]2020年第十一届省赛真题C/C++ B组(七月)
  19. 在Linux终端命令行下播放音乐的命令
  20. 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录

热门文章

  1. 京东云给新建空间添加用户权限,并在jmr中通过linux/hadoop命令查看对应的文件信息
  2. 用木桶装itil,itilv1~itil4的演变
  3. Mac启动Openfire时提示“系统偏好设置错误”
  4. java修改图章图片_Java 处理PDF图章(印章)——图片图章、动态图章
  5. 天文学家对外星文明的分类如何指导我们探索AI?
  6. fotf matlab,分数阶matlab工具箱
  7. sql server2008调试存储过程的完整步骤
  8. Python函数基础教程-张明阳-专题视频课程
  9. win10 1050显卡torch调用不到GPU问题处理
  10. 去除select下拉框默认样式