大话数据结构15 : 线索二叉树
基础介绍
线索二叉树就是当用链表组成的二叉树其在叶节点或者分支中有空指针时,将空指针指向自己的前驱后者后继
记录后继
记录前驱
线索二叉树
数据结构
代码实现
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#define MAXSIZE 100 /* 存储空间初始分配量 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char TElemType;typedef enum {Link ,Thread}PointerTag;/* Link==0表示指向左右孩子指针, */ /* Thread==1表示指向前驱或后继的线索 */typedef struct BiThrNode
{TElemType data;struct BiThrNode* lchild, * rchild;PointerTag LTag;PointerTag RTag;
} *BiThrTree;TElemType Nil = '#'; /* 字符型以空格符为空 */Status visit(TElemType e)
{printf("%c ", e);return OK;}/* 按前序输入二叉线索树中结点的值,构造二叉线索树T */
/* 0(整型)/空格(字符型)表示空结点 */
Status CreateBiThrTree(BiThrTree* T)
{TElemType h;h = 1;if (h == Nil)*T = NULL;else{T = new BiThrTree();if (!*T)exit(OVERFLOW);(*T)->data = h; /* 生成根结点(前序) */CreateBiThrTree(&(*T)->lchild); /* 递归构造左子树 */if ((*T)->lchild) /* 有左孩子 */(*T)->LTag = Link;CreateBiThrTree(&(*T)->rchild); /* 递归构造右子树 */if ((*T)->rchild) /* 有右孩子 */(*T)->RTag = Link;}return OK;
}BiThrTree pre; /* 全局变量,始终指向刚刚访问过的结点 *//* 中序遍历进行中序线索化 */
void InThreading(BiThrTree p)
{if (p){InThreading(p->lchild);/* 递归左子树线索化 *///中序if (!p->lchild)//没有左孩子{p->LTag = Thread;p->lchild = pre;}if (!pre->rchild){pre->RTag = Thread;pre->rchild = p;}pre = p;InThreading(p->rchild);/* 递归右子树线索化 */}
}/* 中序遍历二叉树T,并将其中序线索化,Thrt指向头结点 */
Status InOrderThreading(BiThrTree* Thrt, BiThrTree T)
{*Thrt = (BiThrTree)malloc(sizeof(BiThrNode));if (!*Thrt)exit(OVERFLOW);(*Thrt)->LTag = Link; /* 建头结点 */ // link == 0(*Thrt)->RTag = Thread; // thread == 1(*Thrt)->rchild = (*Thrt); /* 右指针回指 */if (!T) /* 若二叉树空,则左指针回指 */(*Thrt)->lchild = *Thrt;else{(*Thrt)->lchild = T;pre = (*Thrt);InThreading(T); /* 中序遍历进行中序线索化 */pre->rchild = *Thrt;pre->RTag = Thread; /* 最后一个结点线索化 */(*Thrt)->rchild = pre;}return OK;
}/* 中序遍历二叉线索树T(头结点)的非递归算法 */
Status InOrderTraverse_Thr(BiThrTree T)
{BiThrTree p;p = T->lchild; /* p指向根结点 */while (p != T){ /* 空树或遍历结束时,p==T */while (p->LTag == Link)p = p->lchild;if (!visit(p->data)) /* 访问其左子树为空的结点 */return ERROR;while (p->RTag == Thread && p->rchild != T){p = p->rchild;visit(p->data); /* 访问后继结点 */}p = p->rchild;}return OK;
}int main()
{BiThrTree H, T;printf("请按前序输入二叉树(如:'ABDH##I##EJ###CF##G##')\n");CreateBiThrTree(&T); /* 按前序产生二叉树 */InOrderThreading(&H, T); /* 中序遍历,并中序线索化二叉树 */printf("中序遍历(输出)二叉线索树:\n");InOrderTraverse_Thr(H); /* 中序遍历(输出)二叉线索树 */printf("\n");return 0;
}
大话数据结构15 : 线索二叉树相关推荐
- C语言数据结构之线索二叉树
C语言数据结构之线索二叉树 tips:前些天学习了二叉树的相关操作,今天来总结一下线索二叉树的操作. 线索二叉树:对二叉树以某种次序遍历得到序列中的前驱和后继,其中指向结点前驱和后继的指针称为线索,再 ...
- 【Java数据结构】线索二叉树
中序线索二叉树 线索二叉树概述 线索二叉树代码实现 线索二叉树的数据结构 线索二叉树的遍历 线索二叉树示例完整代码 线索二叉树类 ThreadedBinaryTree 线索二叉树节点类 Threade ...
- 数据结构_线索二叉树(C语言)
数据结构总目录 线索二叉树 1. 结构解析 线索二叉树,是对链式二叉树中的空指针的再次利用,在一般的链式二叉树中,叶子结点都存在左右空指针,所以为了不浪费这些空指针,于是就有了线索二叉树. 线索二叉树 ...
- 常用数据结构之线索二叉树和哈夫曼树
1.线索二叉树 上一篇二叉树中,我们介绍了基本的二叉树的结构.每一个父节点对应两个子节点,左子节点和右子节点.其中我们会看到,很多节点的左右节点都为null,为了更高效的存储和遍历,我们考虑一种方式将 ...
- 数据结构之线索二叉树
线索二叉树 思维导图: 线索二叉数的引入: 线索二叉树: 前序遍历的线索二叉树: 中序遍历的线索二叉树(常): 后序遍历的线索二叉树: 线索二叉树的节点结构: 中序线索二叉树代码实现 中序线索二叉树的 ...
- 数据结构——前序线索二叉树及其前序遍历
/************************ author's email:wardseptember@gmail.com date:2017.12.26 前序线索二叉树的前序遍历 ****** ...
- 数据结构之线索二叉树详细解释
1.1 线索二叉树的原理 我们现在倡导节约型社会,一切都应该以节约为本.但当我们创建二叉树时我们会发现其中一共有两个指针域,有的指针域指向的结构为空,这也就浪费了很多空间.所以为了不去浪费这些空间我们 ...
- 【数据结构】-线索二叉树(后序)
后序线索化二叉树 1.头文件及类型定义 2.线索二叉树结点类型定义 3.函数声明 4.基本操作 4.1 先序建立线索二叉树 4.2 初始化tag 4.3 后序线索化二叉树 4.3.1 访问并建立线索 ...
- 【霍罗维兹数据结构】线索二叉树 | THREADED BINARY TREES
前言 最近在读霍罗维兹的<数据结构基础>(Fundamentals of Data Structures in C),本篇博客为阅读笔记和知识总结. 0x00 线索(threads) 具有 ...
最新文章
- 简述php中文件上传过程,简单php文件上传详细说明
- pure abstract class(什么是纯抽象类?)
- Python跨文件全局变量的方法
- svn 没有绿色小勾
- Java并发之volatile
- 面临重重挑战 华为造车之路任重道远
- 深度学习基础(十一)—— 稀疏自编码器(二)
- 【转】JQuery中$.each 和$(selector).each()的区别详解
- 搭建STM32开发环境——STM32CubeMX并配合Keil5重写跑马灯程序
- Windows 下安装FastDFS客户端fdfs-client-py
- Mstar 648 平台遥控器/按键包POWER键配置
- EXCEL单元格内怎么换行?Alt+Enter
- 服务器显示器出现actions,微软已修复Win10中Action Center显示在屏幕左侧问题
- Windows10系统变慢,用上这19招,电脑性能大幅度提升!
- mac强制关机后悲剧了
- nginx配置介绍(二)
- Oracle数据库的数据备份
- python3.7以上使用pyinstaller将py文件打包为exe ,解决安装后显示‘pyinstaller‘ 不是内部或外部命令,也不是可运行的程序或批处理文件的错误
- [附源码]计算机毕业设计Node.js张家界旅游景点网站论文(程序+LW)
- Windows API 理解----Nt* Zw*
热门文章
- 编译linux内核时出错
- Killzone's AI: dynamic procedural combat tactics
- Microsoft Enterprise Library---解读Configuration之元数据
- webstorm设置文件类型
- 三维重建5:场景中语义分析/语义SLAM/DCNN-大尺度SLAM
- Centos7 安装mongodb记录
- 数据挖掘与数据化运营实战. 3.12 数据产品
- service worker之cache实践--sw-precache
- 【LeetCode】TreeNode类实现解析(java实现)
- 找DB2存储过程的package