二叉树的二叉线索存储表示

数据结构之线索二叉树详细解释 1.1 线索二叉树的原理 我们现在倡导节约型社会,一切都应该以节约为本。但当我们创建二叉树时我们会发现其中一共有两个指针域,有的指针域指向的结构为空,这也就浪费了很多空间 阅读详情

转载:http://hi.baidu.com/fire_man/blog/item/0dd0dbcacf348884c81768a9.html

/* c6-3.h 二叉树的二叉线索存储表示 */

typedef enum{Link,Thread}PointerTag; /* Link(0):指针,Thread(1):线索 */

typedef struct BiThrNode

{

    TElemType data;

    struct BiThrNode *lchild,*rchild; /* 左右孩子指针 */

    PointerTag LTag,RTag; /* 左右标志 */

}BiThrNode,*BiThrTree;

/* bo6-3.c 二叉树的二叉线索存储(存储结构由c6-3.h定义)的基本操作 */

Status CreateBiThrTree(BiThrTree *T)

{ /* 按先序输入二叉线索树中结点的值,构造二叉线索树T */

    /* 0(整型)/空格(字符型)表示空结点 */

    TElemType h;

#if CHAR

    scanf("%c",&h);

#else

    scanf("%d",&h);

#endif

    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;

}

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

void InThreading(BiThrTree p)

{ /* 中序遍历进行中序线索化。算法6.7 */

    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); /* 递归右子树线索化 */

    }

}

Status InOrderThreading(BiThrTree *Thrt,BiThrTree T)

{ /* 中序遍历二叉树T,并将其中序线索化,Thrt指向头结点。算法6.6 */

    *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;

}

Status InOrderTraverse_Thr(BiThrTree T,Status(*Visit)(TElemType))

{ /* 中序遍历二叉线索树T(头结点)的非递归算法。算法6.5 */

    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;

}

 

【数据结构】树、二叉树、森林(存储结构篇) 主要内容 树的基本术语 二叉树(Binary Tree) 性质 存储结构 一般树的存储结构 森林的存储结构 树的基本术语 1)结点:树中的一个独立单元,包括数据域(存储数据元素信息)和一个或若干个指针域(如存储直接后继位置的域)。 /*-------结点的数据结构-------*/ typedef int Elemtype /*设置数据(元素)的类型为整型*/ ty... 阅读详情

相关推荐

树与二叉树:核心概念与存储结构详解

摘要:本文系统介绍了树与二叉树的基本概念、存储结构及应用。重点阐述了树的定义及其与二叉树的区别,详细讲解了二叉树的性质、顺序与链式存储结构实现。深入剖析了二叉树的遍历算法(递归/非递归)及线索二叉树原理。分析了树的三种存储方式(双亲/孩子/孩子兄弟表示法)及其适用场景,详解了森林与二叉树的转换规则。最后,重点介绍了哈夫曼树的构造算法及其在数据压缩中的典型应用——哈夫曼编码,包括编码生成、解码过程和完整代码实现。全文通过概念讲解、示例演示和代码实现相结合的方式,全面覆盖了树形数据结构的关键知识点。

2501_93587862的博客 1520

线索二叉树——中序

【why】 当用二叉链表来存储二叉树时,每次只能找到左右孩子的信息,不能直接找到其前驱和后继结点的信息。线索二叉树就解决了这个问题。线索二叉树是对二叉链表中空指针的充分利用,也就是说,使得原本是空指针的转化成在某种遍历的顺序下,指向该结点的前驱和后继。 在二叉链表中,每个结点都带有*leftChild和*rightChild,两个指针,而除根结点外,每个结点只被一个指针所对应,要么是leftC...

张文慧 期待每一天更好的自己 773

二叉树的二叉链存储

二叉树的二叉链存储 //二叉树的二叉链存储.cpp //二叉树的二叉链存储.cpp //二叉树的二叉链存储.cpp

二叉树的存储表示

二叉树的数组存储表示 在数据处理过程中二叉树的大小、形态不发生剧烈的动态变化的场合,适宜采用数组方式来表示二叉树的抽象数据类型 1、完全二叉树的数组存储表示 设有一棵完全二叉树,将其所有结点按照层次自顶向下、同一层自左向右进行按序编号1 - n,得到一个结点的顺序(线性)序列。在数组下标为 i 的位置,存放编号为 i 的完全二叉树的结点。这种存储表示是存储完全二叉树最简单、最省存储的方式,因为可以从一个结点的编号推算出它的父结点、子女、兄弟等结点的编号 数组存储的缺陷:对待一般二叉树来说,有可能导致浪费大量

q793145253的博客 2436

【电机学复习笔记】同步电机的特性及参数的求取

同步电机的主要特性包括:空载特性、短路特性、零功率因数负载特性、外特性和调整特性。 基于以上特性我们可以实现: 从空载特性和短路特性求同步电抗的不饱和值和短路比; 从零功率因数负载特性和空载特性确定保梯电抗(定子漏抗)和电枢反应电动势

Pantrick_的博客 2万+

SAP FICO 银企直连

银企直联或者自动付款的目的是和银行做一个接口,把SAP中的到期应付款(也包括预付款)按照一定格式(银行要求的)在审批后发送给银行,请银行按照这个付款指定进行付款,并跟踪付款状态的过程,这个过程在SAP中如何实现呢?根据个人项目经验,客户需求可分为如下三种: 1. 第一种是完全不自动方式,仅批量生成付款凭证,实际的付款还是通过原来的流程执行,和银行没有任何接口; 2. 第二种是半自动方式,这种方式下需要按照银行的要求的格式生成付款条件,然后把付款文件下载下来,通过企业版的网银接口把付款文件进行上载,提交后

IamRunjiang的博客 9290

二叉树的链式存储表示,创建、遍历等算法,数据结构,C++

1. 创建二叉树的链式存储表示。由二叉树的先序序列和中序序列创建二叉树; 2. 按树状打印二叉树。例如:假设每个结点所含数据元素均的单个字母,左下图二叉树印为右下形状。 3. 统计二叉树的叶子结点个数。 4. 给出二叉树的后序和层次序。 5. 输出二叉树中从根结点到所有叶子结点的路径。...

qq_52788258的博客 2233

EDA工具安装第一步:Synopsys Installer的配置与图形化界面使用详解

本文详细解析了EDA工具安装的关键第一步——Synopsys Installer的配置与使用。文章阐述了其作为统一部署管理器和依赖协调者的核心作用,并分步详解了如何通过图形化界面高效安装EDA工具,同时介绍了命令行批处理等进阶技巧,旨在帮助工程师快速搭建稳定的芯片设计环境。

zeta9的博客 341

二叉树的二叉线索存储(第六章 P132 算法6.5-6.7)

typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */ #include<malloc.h> /* malloc()等 */ #include<stdio.h> /* EOF(=^Z或F6)...

但行好事,莫问前程 1165

机器学习模型——非线性回归

升维是一种常用的处理非线性问题的方法,它通过将原始数据从低维空间映射到高维空间来增强模型的表达能力。我们可以看出,二维数据用一维直线很难去很好的拟合。升维里的degree设置的不易过大,否则容易造成维度灾难。升维后,拟合的线与原数据比较符合。将非线性问题转换为线性问题。

qq_60688380的博客 1421

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP+ 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器拨号后再回接到交换机,这样就可以替换掉光猫了。

啦啦啦啦 la 1万+

线索二叉树 && 树的存储结构

背景:为解决遍历只能从根结点开始这个问题,因为普通二叉树找前驱和后继很麻烦线索二叉树在二叉树的结点上加上线索的二叉树。

一只小水豚 793

R语言绘图中文显示全攻略:从乱码到完美适配

本文详细解析了R语言绘图中的中文显示问题,从乱码根源到完美适配方案。通过showtext、sysfonts和extrafont等工具包的应用,提供跨平台的中文显示解决方案,涵盖ggplot2图表、PDF/PNG输出及Shiny应用等场景,助力用户高效实现R绘图中文完美呈现。

hp777的博客 258

二叉树的二叉线索存储

/* c6-3.h 二叉树的二叉线索存储表示 */ typedef enum{Link,Thread}PointerTag; /* Link(0):指针,Thread(1):线索 */ typedef struct BiThrNode { TElemType data; struct BiThrNode *lchild,*rchild; /* 左右孩子指...

aeg84268的博客 239

5G/NR SSB学习总结

6.1 SSB概念 同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB),它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH三部分共同组成。 6.2 SSB特征 ...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 8万+

图神经网络实战——总结 | 图神经网络展望

短短数年时间,图神经网络 (Graph Neural Networks, GNN) 已经成为一种重要的深度学习架构,并且已经广泛应用于各个行业。通过本专栏的学习,能够对图学习和 GNN 领域有一个全面的了解,并能为各种应用设计、构建GNN模型。

盼小辉丶的博客 8560

第五章 树和二叉树(中)【线索二叉树、树和森林】

n 个结点的二叉树,有 n+1 个空链域,可用来记录前驱、后继的信息。指向前驱、后继的指针被称为“线索”,形成的二叉树被称为线索二叉树。

zdlzf的博客 524

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

树、二叉树、线索二叉树

树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 :有且仅有一个特定的称为根(Root)的节点其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树, 并称为其根的子树(Subtree)。树的定义具有递归性,即“树中还有树”。二叉树是每个结点最多有两个子树的树结构。二叉树不允许存在度⼤于2的树。它有五种最基本的形态:二叉树可以是空集根可以有空的左子树或者右子树;左右子树都是空。只有左子树或者右子树的叫做斜树。

Z5433523的博客 249

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

线索二叉树

#include #include #define LEN sizeof(struct ThreadBinTree) #define NULL 0 enum NodeFlag { SubTree, Thread }; //枚举值SubTree和Thread分别为0,1 struct

无名 674

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【数据结构】线索二叉树&哈夫曼树&森林

树和二叉树 线索二叉树 定义 我们遍历二叉树的得到一个线性序列,指向该线性序列的“前驱”和“后继”的指针,称为“线索”。 线索链表是在二叉链表的基础上增加两个标志域,如果该结点的左子树不空,那么Lchild域的指针指向其左子树,并且将左标志域的值设为“指针Link”,说明Lchild域中是指向左子树;否则,Lchild域的指针指向遍历得到的线性序列的“前驱”,将左标志域的值定为“线索Thread”。Rchild同样,但是在没有右子树时,指向“后继” 这种记录方式可以使得我们很快找到一个结点的“前驱”和“后继

Luminous_song的博客 450

线索二叉树基本概念,举例理解线索二叉树,遍历中序线索二叉树

为什么要研究线索二叉树? 当用二叉链表作为二叉树的存储结构时,可以很方便地找到某个结点的左右孩子;但一般情况下,无法直接找到该结点在某种遍历序列中的前驱和后继结点。 之前学到的二叉树链表中空指针域的数量:具有n个结点的二叉链表中,共有n+1个指针域为空 线索二叉树基本概念 利用二叉链表中的空指针域: 如果某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱;如果某结点的右孩子为空,则将空...

ker的博客 1440

数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解

本文由二叉树的遍历起手,讲解了二叉树的三种遍历方式,以及如何构造一颗二叉树,并在此基础上,扩展了更好的二叉树-线索二叉树。树和森林的存储结构讲解中,重点就是将树与森林转换为二叉树,这样二叉树的手段就能使用到树与森林当中。最后,讲解了二叉树与森林的遍历。

weixin_62613321的博客 1700

数据结构与算法——顺序化二叉树与线索化二叉树

顺序存储二叉树 从数据存储来看,数组存储方式和树的存储方式可以相互转化,数组可以转化成树,树也可以转化成数组。 顺序存储二叉树的特点: 顺序二叉树通常只考虑完全二叉树。 第n个元素的左子节点 2 * n + 1 第n个元素的右子节点 2 * n + 2 第n个元素的父节点为 (n-1) / 2 n :表示二叉树中的第几个元素(按0开始编号) 代码实现前序遍历(数组形式): //index 代表下标 默认0 public void preOrder(int index){ if (arr.len

nswdiphone6的博客 253

05数据结构——树与二叉树

本文主要介绍了树和二叉树的基本操作算法,包括存储,遍历.........

m0_73139998的博客 550

数据结构之线索7—二叉树和森林

线索二叉树 利用空指针域来真存放结点的前驱和后继信息 ♦ 定义: 前驱与后继:在二叉树的先序、中序或后序遍历序列中两个相邻的结点互称为~ 线索:指向前驱或后继结点的指针称为~ 线索二叉树:加上线索的二叉链表表示的二叉树叫~ 线索化:对二叉树按某种遍历次序使其变为线索二叉树的过程叫~ ♦ 实现: 在有n个结点的二叉链表中必定有n+1个空链域 在线索二叉树的结点中增加...

weixin_30237281的博客 142
上一篇: 树的双亲表存储表示
下一篇: 二叉树的二叉链表存储表示
K行天下
博客等级 码龄19年 358粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值