线索二叉树 —C语言王道
目录
线索二叉树概念
——普通二叉树缺点
——中序线索二叉树
——先序线索二叉树
——后序线索二叉树
—— 三种线索二叉树的比较
二叉树的线索化
普通方法代码
中序线索化代码
先序线索化代码
后序线索二叉树代码
线索二叉树概念
——普通二叉树缺点
1、普通二叉树在遍历的时候必须从根节点出发,不能从其中某一点开始遍历。
2、普通二叉树不能快速的找到某个结点的前驱。(可以实现,思路如下)
从根结点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针pre记录上一个被访的结点 ①当 q == p 时,pre为前驱
②当 pre == p 时,q为后继
缺点是找前驱,后继操作不方便:遍历操作必须从根开始
——中序线索二叉树
n个结点的二叉树,有n+1个空链域!可以用来记录n个前驱、后继的信息
指向前驱、后继的指针称为线索
图示说明
代码如下
//二叉树的结点(链式存储)
typedef struct BiTNode{ElemType date;struct BiTNode *lchild, *rchild
}BiTNode ,*BiTree;
//线索二叉树结点
typedef struct ThreadNode{ElemType date;struct ThreadNode *lchild *rchild;int ltag,rtag;
}ThreadNode,*ThreadTree;
tag == 0 ,表示指针是指向孩子
tag == 1,表示指针是指向“线索”
——先序线索二叉树
和上同理
——后序线索二叉树
和上同理
—— 三种线索二叉树的比较
二叉树的线索化
用土方法找到中序遍历前驱
普通方法代码
//辅助全局变量,用于查找p的前驱
BiTNode *p; //p指向目标结点
BiTNode * pre = NULL; //指向当前访问结点的前驱
BiTNode * fina = NULL; //用于记录最终结果
void InOrder(BITree T){if(T != NULL){InOrder(T->lchild); //递归遍历左子树 visit(T); // 访问根结点 InOrder(T->rchild); // 递归遍历右子树 }
}
// 访问结点q
void visit(BoTNode *q){if(q == p) //当前访问的结点刚好是p final = pre; //找到p的前驱 else pre = q; //pre指向当前访问的结点
}
中序线索化代码
当ltag = 0,rtag = 0 的时候,表示没有被线索化
//全局变量,pre指向当前访问结点的前驱
ThreadNode *pre = NULL;
//线索二叉树结点
typedef struct ThreadNode{ElemType data;struct ThreadNode *lchild,*rchild;int ltag,rtag;
}ThreadNode,*ThreadTree;
//中序遍历二叉树,一边遍历一边线索化
void InThread(ThreadTree T){if(T!=NULL){InThread(T->lchild); //中序遍历左子树 visit(T); //访问根结点 InThread(T->rchild); //中序遍历右子树 }
}
void visit(ThreadNode *q) {if(q->lnext == NULL){ //左子树为空,建立前驱线索 q->lchild = pre;q->ltag = 1;}if(pre != NULL && pre->rchild == NULL){pre->rchild = q; //建立前驱结点后继线索 pre->rtag = 1;}pre = q;
}
//中序线索化二叉树
void CreateInThread(ThreadTree T){pre = NULL;if(T!=NULL){ //非空二叉树才能线索化 InThread(T); //中序线索化二叉树 if(pre->rchild==NULL)pre->rtag = 1; //处理遍历的最后一个结点 }
}
先序线索化代码
//全局变量,pre指向当前访问结点的前驱
ThreadNode *pre = NULL;
//线索二叉树结点
typedef struct ThreadNode{ElemType data;struct ThreadNode *lchild,*rchild;int ltag,rtag;
}ThreadNode,*ThreadTree;
//先序遍历二叉树
void InThread(ThreadTree T){if(T!=NULL){visit(T);if(t->ltag == 0)preThread(T->lchild);PreThread(T->rchild); }
}
void visit(ThreadNode*q) {if(q->lnext == NULL){ //左子树为空,建立前驱线索 q->lchild = pre;q->ltag = 1;}if(pre != NULL && pre->rchild == NULL){pre->rchild = q; //建立前驱结点后继线索 pre->rtag = 1;}pre = q;
}//先序线索化二叉树
void CreateInThread(ThreadTree T){pre = NULL;if(T!=NULL){ //非空二叉树才能线索化 InThread(T); //先序线索化二叉树 if(pre->rchild==NULL)pre->rtag = 1; //处理遍历的最后一个结点 }
}
后序线索二叉树代码
//全局变量,pre指向当前访问结点的前驱
ThreadNode *pre = NULL;
//线索二叉树结点
typedef struct ThreadNode{ElemType data;struct ThreadNode *lchild,*rchild;int ltag,rtag;
}ThreadNode,*ThreadTree;
//后序遍历二叉树,一边遍历一边线索化
void InThread(ThreadTree T){if(T!=NULL){InThread(T->lchild); //后序遍历左子树 InThread(T->rchild); //后序遍历右子树 visit(T); }
}
void visit(ThreadNode *q) {if(q->lnext == NULL){ //左子树为空,建立前驱线索 q->lchild = pre;q->ltag = 1;}if(pre != NULL && pre->rchild == NULL){pre->rchild = q; //建立前驱结点后继线索 pre->rtag = 1;}pre = q;
}
//中序线索化二叉树
void CreateInThread(ThreadTree T){pre = NULL;if(T!=NULL){ //非空二叉树才能线索化 InThread(T); //中序线索化二叉树 if(pre->rchild==NULL)pre->rtag = 1; //处理遍历的最后一个结点 }
}
线索二叉树 —C语言王道相关推荐
- 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树
在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...
- 线索二叉树(C语言详解----画图理解)
揽 1. 前序 2.定义数据结构 3.线索二叉树的规律 3.1 图示 4.手算线索过程 5.问题以及改进 6.查找前驱和后继算法 7.代码 7.1建立二叉树 7.2 中序线索 7.4 前驱查找 7.5 ...
- 线索二叉树-C语言实现
线索二叉树的定义 在二叉链表中, 具有 n 个结点的二叉链表有 n + 1 个空指针域. 由此, 可以利用这些空指针域来存放结点的直接前驱和直接后继的信息 结点的存储结构 lchild ltag da ...
- 数据结构_线索二叉树(C语言)
数据结构总目录 线索二叉树 1. 结构解析 线索二叉树,是对链式二叉树中的空指针的再次利用,在一般的链式二叉树中,叶子结点都存在左右空指针,所以为了不浪费这些空指针,于是就有了线索二叉树. 线索二叉树 ...
- C语言实现线索二叉树Threaded Binary Tree (附完整源码)
C语言实现线索二叉树Threaded Binary Tree 树节点定义 实现以下7个接口 完整实现和main测试源码 树节点定义 typedef struct Node {int data; /** ...
- 线索二叉树详解(C语言版)
文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 前面学习了二叉树,在操作过程中发现了几个问题: 问题一:二叉树如何才能实现从一个指定结点开始遍历呢? 问题二:在二叉树 ...
- c语言线索二叉树作用,C语言递归实现线索二叉树
本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...
- 怎样用C语言实现线索二叉树
在实现线索二叉树时,需要在二叉树的结点中增加两个指针,分别指向前驱结点和后继结点. 下面是一个线索二叉树的结构体定义: typedef struct ThreadNode {char data;str ...
- C语言数据结构之线索二叉树
C语言数据结构之线索二叉树 tips:前些天学习了二叉树的相关操作,今天来总结一下线索二叉树的操作. 线索二叉树:对二叉树以某种次序遍历得到序列中的前驱和后继,其中指向结点前驱和后继的指针称为线索,再 ...
最新文章
- iOS 自定义转场动画初探
- Windows Mobile与OPhone开发对比
- 设计模式之建造者模式(01)
- AMD:“全民四核”大作战
- shrio的rememberMe不起作用
- C#判断某软件是否安装
- The repository does not have a Release
- 容器编排技术 -- Kubernetes kubectl edit 命令详解
- 移动端点击拉起输入_耐用的筛分式移动破碎站
- 【Mac】setremotelogin: Turning Remote Login on or off requires Full Disk Access privileges.
- juniper srx电话单通
- 【交通标志识别】基于matlab GUI矩匹配算法路标识别【含Matlab源码 1175期】
- js返回上一页并刷新、返回上一页、自动刷新页面
- 选股小技巧|如何选股
- python爬虫教程下载-Python网络爬虫从入门到精通 PDF 下载
- 5款宝藏浏览器插件推荐,每一个都真香,一定要看到最后
- CentOS 7静态IP在主机重启后失效解决
- path development介绍
- .XXX文件的文件类型变成WanNengZip.XXX应该如何打开(阻止流氓软件万能压缩、好压、快压等挟持正常软件)
- Pr 入门系列之四:编辑(基础篇)
热门文章
- 苹果悬浮球_今天才发现!iPhone手机悬浮球这么好用!怪自己知道太晚了
- 2019.5.24 自学前端 120天
- UEFI模式下WIN10+Ubuntu18.04LTS(挂载到固态加机械)双系统安装
- 【MySQL基础教程】DQL语句详细介绍
- 网页字体 服务器上,网页字体云服务器
- 双十一值得入手的运动耳机推荐,2022年好用排行榜运动耳机推荐
- 判断文件上传时文件的类型
- Python学习笔记之扑克牌比大小
- 一加7pro电脑模式_谈谈一加7 Pro的几个小功能 虽然简单但很实用
- (附源码)springboot校园新闻网站的设计与实现 毕业设计142357