[数据结构]程杰 线索二叉树代码

线索二叉树(图解+完整代码) 线索化二叉树的图解与完整C语言代码 阅读详情


算法演示可以参见这里:http://sjjg.js.zwu.edu.cn/SFXX/sf1/zxxsh.html


#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
/*线索二叉树----Threaded Binary Tree
 * 二叉树线索化的目的是更好地利用空间和时间。
 * 1、普通的二叉树会有不少闲置的空指针
 * 2、如果能在创建树的时候让一些节点记住它的前驱和后继,这将能在很大的程度地方便操作。
 * */
#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;		            /* 左右标志 */
	//LTag为0的时候,指向该节点的左孩子,为1的时候指向该节点的前驱。
	//RTag为0的时候,指向该节点的右孩子,为1的时候指向该节点的后继。
} BiThrNode, *BiThrTree;

TElemType Nil='#'; /* 字符型以空格符为空 */

BiThrTree pre; /* 全局变量,始终指向刚刚访问过的结点 */

Status visit(TElemType e)
{
	printf("%c ",e);
	return OK;
}

/* 按前序输入二叉线索树中结点的值,构造二叉线索树T */
/* 0(整型)/空格(字符型)表示空结点 */
Status CreateBiThrTree(BiThrTree *T)
{
	TElemType h;
	scanf("%c",&h);
	//如果h==Nil
	if(h==Nil)
		*T=NULL;
	else
	{
		*T=(BiThrTree)malloc(sizeof(BiThrNode));
		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;
}



/* 中序遍历进行中序线索化 */
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; /* 前驱右孩子指针指向后继(当前结点p) */
		}
		pre=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; /* 建头结点 */
	(*Thrt)->RTag=Thread;
	(*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;
}


数据结构与算法书籍推荐(7本) 阅读详情

相关推荐

数据结构——线索二叉树

线索二叉树实际上就是对二叉树进行线性化。他把二叉树的没一个节点排列成一个线性序列。 二叉树节点创建

q1060701529的博客 801

数据结构(8)线索二叉树的介绍以及代码实现

这篇文章我们接着讲二叉树。 文章目录1. 二叉树遍历--先序遍历、中序遍历、后序遍历和层次遍历1. 先序遍历:ABDEGHCF2. 中序遍历:DBGEHAFC3. 后序遍历:DGHEBFCA4. 层次遍历:ABCDEFGH2. 线索二叉树的定义3. 二叉树的线索化1. 二叉树的线索化代码实现4. 线索二叉树的基本运算 1. 二叉树遍历–先序遍历、中序遍历、后序遍历和层次遍历 所谓二叉树的遍历,是指...

it_is_me_a的博客 458

电机系列(1) - foc最基本原理、clark变换 、park变换、附代码

什么是FOC? FOC(Field-Oriented Control),直译是磁场定向控制,也被称作矢量控制 (VC,Vector Control) ,是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最优方法之一。FOC旨在通过精确地控制磁场大小与方向,使得电机的运动转矩平稳、噪声小、效率高,并且具有高速的动态响应。 简单来说就是,FOC是一种对无刷电机的驱动控制方法,它可以让我们对无刷电机进行 “像素级” 控制,实现很多传统电机控制方法所无法达到的效果。 因为所谓的“矢量控制”其实就是

nepqiu的博客 7万+

数据结构与算法【基础版】:4.11 线索二叉树代码的实现

代码: 1:类[BinaryTree]中写出对应的方法【其余代码看4.4】 //用于临时存储前驱节点 TreeNode pre = null; //中序线索化二叉树 public void treeNodes(){ treeNodes(root); } public void treeNodes(TreeNode node) { //当前节点如果为null,直接返回 if(node == null){

qq_40572023的博客 191

vesta软件_分子动力学计算实战:利用 OVITO 软件找弗伦克尔缺陷和位错环分析

今天继续和大家分享这篇纯分子动力学(MD)的 Nat. Comm. 文章(DOI:10.1038/s41467-018-07102-3)。上期推文(从一篇 Nat. Comm. 学习经典分子动力学基本知识和相关软件基本操作 (一)),我们借用该文章的 fig.1 简单介绍了如何用文中所提到的 LAMMPS 软件来实现材料中级联碰撞过程。但是,想完整的展示类似该文章的 fig.1,单纯利用...

weixin_39524842的博客 5982

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 334

数据结构-线索二叉树(后序线索二叉树及遍历)

后序线索二叉树 线索化的概念及相关图解 在上一篇中详细介绍了中序线索二叉树,线索化图解及相关概念都放在那篇博客啦,放个传送门 线索二叉树详细解析(含图解):传送门 包括还有先序线索二叉树:传送门   后序线索二叉树 (1)后序线索二叉树的构造              ①思路:在这里说下构造的原因,与先序中序线索二叉树不同,在遍历时后序时先把孩子全部遍历了再回到父...

[SZU_Crayon] 4万+

惊呆了!Oracle 11g从入门到放弃的保姆级指南(新手必看)

本文为Oracle 11g数据库新手提供了一份详尽的入门指南。内容涵盖从安装配置、SQL*Plus工具使用、核心的SQL增删改查操作,到事务、索引等进阶概念的解析。文章旨在帮助初学者避开常见陷阱,快速掌握这一经典关系型数据库管理系统的基本操作与核心技能,实现从入门到上手。

ooo22的博客 265

数据结构之线索二叉树(C语言实现)

/* ******************************************************************************** * 数据结构 * * * * 作者: zhi-...

DataH 1876

OpenClaw实战系列04:Jira/Confluence深度集成实战指南

汇总 Confluence 空间 TEAM 下所有关于“性能优化”的文档,输出要点自然语言创建和查询 Jira 任务,无需离开聊天工具基于 Confluence 的私有知识库问答,让 AI 真正理解团队文档Jira 与 Confluence 联动,打通项目管理与知识管理定时同步与通知,自动化团队信息流转至此,你的 OpenClaw AI 助理已经不仅是一个聊天机器人,而是真正融入团队工作流的“智能项目管理助手”。下一期我们将带来OpenClaw 自定义技能开发实战。

PeterPan的博客 572

3dmax文件格式转换——.max 转换为 .flt(解决转换后.flt没有纹理贴图的问题)

本文主要介绍如何在3dmax中将.max格式文件转换为.flt格式文件,并解决转换后的文件没有纹理贴图的问题。 在3dmax中,将.max文件转换为.flt格式,只需导出选择.flt格式即可,但是导出的文件在osgEarth中加载后,缺少纹理和贴图。 下面是解决方案: 1、选中加载的模型,然后点击 渲染-> 渲染到纹理 2、将 渲染到纹理 子窗口往下拉,点击 添加 按钮,添加 ...

cchangcs 6165

《数据结构、算法与应用C++语言描述》-线索二叉树的定义与C++实现

《数据结构、算法与应用C++语言描述》-线索二叉树的定义与C++实现

Jasmine-Lily的博客 1084

【72】【OpenCV C++ & C#】 将cv::Mat 图像转换成imgINFO 传给c#在winform上显示,OpenCV C++如何将处理后的图像传给C#呢? 如何获取图像信息呢?

本文介绍了通过OpenCV C++处理图像后传递给C#的方法。首先定义了一个结构体imgINFO存储图像信息(数据指针、宽高、通道数等),然后通过getImgInfo函数将cv::Mat转换为该结构体。文章特别指出当图像宽度不能被4整除时可能出现失真问题,并给出了两种解决方案:调整输入图像或创建新的对齐图像。此外还解释了img.step和img.cols*img.elemSize()的关系,说明它们在大多数情况下是相等的。最后提到需要通过DLL将结构体传递给C#(具体方法参见其他文章)。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 697

《数据结构与算法》(十)- 二叉树详解

目录1. 二叉树简介1.1 二叉树的定义1.2 二叉树的特点1.2 特殊二叉树2. 二叉树的性质2.1 二叉树的性质12.2 二叉树的性质22.3 二叉树的性质32.4 二叉树的性质42.5 二叉树的性质53. 二叉树的存储结构3.1 二叉树顺序存储结构 1. 二叉树简介 1.1 二叉树的定义   现在我们来做个游戏,我在纸上已经写好了一个 100 以内的正整数数字,请大家想办法猜出我写的是哪一个?注意你们猜的数字不能超过 7 个,我的回答只会告诉你是 “大了” 或 “小了”。   这个游戏在一些电视节目中

程序园@大Null 1584

实干派!网易易盾增强版滑块验证码,全方位讲解识别思路(含源码)

该验证码是异形滑块验证码中的一种,缺口旋转+偏移的处理需要你有很好的图像处理知识,能很好的处理透明通道,同时,该验证码需要你能很好的处理缺口和背景之间匹配的关系,该验证码的处理难点就是两个缺口之间如何找到正确的,两个检测框都有很强的相似度,且加上背景图的干扰,在图像处理和有优化上难度大大增加。

码王吴彦祖的博客 2015

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

程杰《大话数据结构》6-3 线索二叉树(C语言源码+运行结果)

#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 MAX

春卷同学的博客 224

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

2021数据结构学习笔记(严蔚敏版)

2021数据结构学习笔记(严蔚敏版) 第2章 线性表 线性表的顺序表示和实现 线性表的顺序表示和实现(二级指针实现) 线性表的链式表示和实现 静态链表 循环链表 双向链表 第三章 栈和队列 栈 栈的应用—递归 队列 第五章 数组 数组 第六章 树和二叉树 树和二叉树 二叉树的创建方式 遍历二叉树及其应用 线索二叉树 树和森林 哈夫曼树及其应用 第七章 图 图的基本概念和存储方式 图的遍历 图的最小生成树 图的拓扑排序和关键路径 图的最短路径 第九章 查找 静态查找表 动态查找表(BST/AVL/B/B+/R

张小憨憨的博客 2273

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

“树”不倒,人不散—数据结构的核心

数据结构需要一生的温习学习啊!!! 终于有机会重新回头学习一下一直困扰自身多年的数据结构了,赶脚棒棒哒。一直以来,对数据结构的掌握基本局限于线性表,稍微对树有一丢丢了解,而对于图那基本上就是不懂(不可否认,很多的考试中回避了图也是原因之一),而查找和排序只能算是了解点皮毛,简单的面试能应付的水平。关于数据结构方面的教材和视频有不少,首推严蔚敏老教授的书和视频,尤其是视频,记载的是其在清华

java、c++、机器学习方向King 842

数据结构-树

终于有机会重新回头学习一下一直困扰自身多年的数据结构了,赶脚棒棒哒。一直以来,对数据结构的掌握基本局限于线性表,稍微对树有一丢丢了解,而对于图那基本上就是不懂(不可否认,很多的考试中回避了图也是原因之一),而查找和排序只能算是了解点皮毛,简单的面试能应付的水平。关于数据结构方面的教材和视频有不少,首推严蔚敏老教授的书和视频,尤其是视频,记载的是其在清华大学的授课过程,全程通过不同的教具来演示不同的...

weixin_34129696的博客 214

数据结构与算法学习指南

一、资料来源1.教材:★★★★数据结构与算法分析 (豆瓣)(经典之作,广为人知)★★★数据结构 (豆瓣)(严蔚敏的,就是国内大学常用的那本。严谨,伪代码不错。)★★大话数据结构 (豆瓣)(语言比较通俗。比第一本简单易懂。btw,作者程杰老师在知乎上也相当活跃)★★算法(第4版) (豆瓣)(图超多。比第一本简单易懂。)2.慕课:★★★★★浙江大学的:数据结构 - 网易云课堂(真的很棒。借雷军的一句广...

zbw328的博客 1289

数据结构5.1.1 - 线索二叉树 代码测试

目录1 代码2 运行结果2.1 前序线索二叉树2.2 中序线索二叉树2.3 后序线索二叉树 1 代码 #include<bits/stdc++.h> #define max 1000 #define num 100 using namespace std; typedef struct TBNode { int data; //数据 int ltag, rtag; // 0,1; // ltag = 0, lchild指向孩子-左子树; ltag = 1, lchild指向前驱

qq_1403034144的博客 278

数据结构—线索二叉树

数据结构—线索二叉树 1.二叉链表中空间资源的浪费 我们利用节点建立了二叉链表,但是我们发现二叉链表中存在这许多空指针,那么这部分空间就被浪费了,我们应该想办法解决这个问题 假设有一个节点个数为n的二叉链表,那么其中就有2n个指针域,n个节点就会有n-1个分支线树,也就是说就会有2n-(n-1)=n+1个空指针域。如上图,十个节点的二叉树就会有十一个空指针域。 我们在上一篇...

wintershii的博客 1613

数据结构:线索二叉树的创建与遍历 完整代码

InThreading()、InOrderThreading()、InOrderTraverse_Thr()等几个函数来自于严蔚敏老师的数据结构教材,本人编写了main()函数,在VC++6.0和DEV-C++下编译通过。 #include "stdio.h" #include "malloc.h" typedef struct BiThrNode { char data; struct BiThrNode *lchild, *rchild; // 左右指针 int LTag, RTag; /

xifengcode 2958

线索二叉树详解以及代码实现

参照《大话数据结构》188到194页。 一、二叉树的线索存储结构定义 /* 二叉树线索存储结构定义 Link = 0,代表指向左右孩子的指针 Thread= 1 代表指向前驱或后继的线索*/ typedef enum{ Link, Thread} PointerTag; typedef char TypeData; typedef struct BiTreeNode {

不忘初心的专栏 5337

【数据结构】初入数据结构的线索二叉树以及Java代码实现

初入数据结构的线索二叉树以及Java代码实现 前提概念 Java代码实现 前提概念 什么是线索二叉树? 我们知道二叉树的是一棵树的度小于等于2的有序树;那么线索二叉树又是什么呢?线索二叉树实际是一棵变形的二叉树。 如果有一种算法需要经常的对一棵二叉树进行遍历,那么遍历的过程就是在频繁的利用递归或栈做重复性的操作,而线索二叉树不需要如此,通过使用二叉树空闲的内存空间记录某些结点的前趋和...

长路漫漫的歇脚处 684

数据结构——线索二叉树(代码)

线索二叉树 C++ 环境codeblocks17 通过 /* 线索二叉树 @CGQ 2018/10/29 */ #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; using namespace std; #define ElemType char typedef struct BiTN...

地址ch3nye.top 658
上一篇: 链式二查树遍历代码
下一篇: Java 哈希表例子
ilikeprograming
博客等级 码龄14年 46粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值