数据结构——c语言描述 第六章(1)二叉树树的基本操作和二叉树的线索化

数据结构—二叉树线索化(线索化的先序、中序、后序遍历) 1.线索二叉树基本概念 二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。 为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息,n个节点的二叉树中含有n+1个空指针域。 试做如下规定: 若结点有左子树,... 阅读详情

终于到我个人感觉最好玩的一章节,哈哈,个人感觉树和之前的数据结构最重要的区别在于,在这一章当中出现了大量的递归调用,我刚开始也不是很适应,现在基本上也能用得起来递归调用,但是在递归调用中的有时候会出现难以发现的细节,而这些细节往往让程序直接segment fault了,这些细节也只有等着时间的沉淀,代码的积累才会慢慢进步吧。

二叉树的定义:二叉树有一个根节点,根节点下面最多连着两个子二叉树树,可以看见在二叉树的定义当中出现了和广义表一样的特点,就是递归的特性,所以在二叉树的建立,遍历,线索化的过程当中充斥着递归。讲完二叉树的定义之后其实书上写了一大堆关于二叉树的性质的结论和其证明,我在写代码的过程当没用到多少,但是其中有一点比较重要就是如果二叉树有n个节点,那么二叉树的节点的孩子指针当中只有(n+1)个节点指向空指针,这个结论在给二叉树赋值的过程当中和二叉树的线索化过程当中都是有影响的。下面我就把二叉树的代码的写下来,算是对自己学习的一个记录吧。

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0;

typedef char Eletype;
typedef struct TreeNode{
    struct TreeNode *LChild;
    struct TreeNode *RChild;
    Eletype data;
}TreeNode;

void creattree (TreeNode **R) ;
void PreOrder (TreeNode *R) ;
int ChangeChildTree (TreeNode *R) ;
int PostTreeDepth (TreeNode *R) ;

int main () {
    TreeNode *R;
    creattree (&R);
    ChangeChildTree (R);
    PreOrder (R);
    printf ("the tree's depth s %d\n" , PostTreeDepth (R));
}

void creattree (TreeNode **R) {
    char c;

    if ((c = getchar()) != '.') {
        *R = (TreeNode *) malloc (sizeof (TreeNode));
        (*R)->data = c;
        creattree (&((*R)->LChild));
        creattree (&((*R)->RChild));
    }else
        R = NULL;
}

void PreOrder (TreeNode *R) {
    if (R == NULL)
        return;
    printf ("%c\n" , R->data);
    PreOrder (R->LChild);
    PreOrder (R->RChild);
}

int PostTreeDepth (TreeNode *R) {
    int temp1 = 1;
    int temp2 = 1;

    if (R == NULL)
        return 0; 
    temp1 += PostTreeDepth (R->LChild);
    temp2 += PostTreeDepth (R->RChild);
    if (temp1 > temp2)
        return temp1;
    else
        return temp2;
}

int ChangeChildTree (TreeNode *R) {
    TreeNode *temp;

    if (R == NULL || R->LChild == NULL || R->RChild == NULL)
        return FALSE;

    temp = R->LChild;
    R->LChild = R->RChild;
    R->RChild = temp;
    return TRUE;
}
这个就是二叉树的基本操作的实现,包括基本的创建二叉树,前序遍历二叉树,交换二叉树的两个子树,求深度等。二叉树的代码都不是很长,但是都包含了递归的特性。

下面的代码是二叉树的前序线索化,书上给出了中序线索化的代码我刚开始傻乎乎的以为和中序遍历转化为前序遍历一样简单,但是事实证明我还是太simple了,仔细分析了线索化的过程后我发现,在递归的过程当中还是有纰漏存在的,改正之后代码的运行正常!

#include <stdio.h>
#include <stdlib.h>

typedef char EleType;

typedef struct treenode{
    int RTag;
    int LTag;
    struct treenode *LChild;
    struct treenode *RChild;
    EleType data;
}TreeNode;

TreeNode *curr;
TreeNode *pre = NULL;

void creattree (TreeNode **R) {
    int c;

    if ((c = getchar ()) == '.') {
        *R = NULL;
        return;
    }else {
        *R = (TreeNode *) malloc (sizeof (TreeNode));
        (*R)->data = c;
        (*R)->RTag = 0;
        (*R)->LTag = 0;
        creattree (&(*R)->LChild);
        creattree (&(*R)->RChild);
    }
}

void preorder (TreeNode *R) {
    if (R != NULL) {
        printf ("%c " , R->data);
        preorder (R->LChild);
        preorder (R->RChild);
    }
}

void inthreadtree (TreeNode *R) {
    if (R != NULL) {
        if (R->LChild == NULL) {
            R->LTag = 1;
            R->LChild = pre;
        }
        if (pre != NULL && pre->RChild == NULL) {
            pre->RTag = 1;
            pre->RChild = R;
        } 
        pre = R;
        if (R->LTag == 0)
            inthreadtree (R->LChild);
        if (R->RTag == 0)
            inthreadtree (R->RChild);
    }
}

int main () {

    preorder (node);
    printf ("\n");
    inthreadtree (node);
}
首先,线索化要求的二叉树的节点结构比普通的二叉树更加复杂一些,包括了两个额外的节点标识符,左节点和右节点标识符。这是用来标志节点的右节点是什么样的类型,是普通的连接,还是经过线索化之后的指针。这个标识符在线索化的过程中也起到了非常大的作用。下面这四行代码应该是突出细节的一个地方,如果没有之前的if判断语句就会在返回上层递归的时候出现原本是指向NULL但是经过线索化后指向前驱或者后继节点的指针进入循环,这也就是为什么如果在这个地方将两个if语句删除会造成segment fault的原因!
if (R->LTag == 0)
            inthreadtree (R->LChild);
        if (R->RTag == 0)
            inthreadtree (R->RChild);

这里我再上一个二叉树的线索化的插入,书上给出了中序二叉树的插入操作,这里我上一个先序二叉树的插入,不保证正确。。。。


重邮802数据结构复习指南:严蔚敏教材核心考点与代码实战精讲 数据结构是计算机科学的核心基础,它研究数据的组织、存储与操作方式,其核心原理在于通过逻辑结构与物理存储结构的有效结合,来提升数据处理的效率。从线性表、栈、队列到树、图等非线性结构,每种数据结构都对应着特定的算法思想,如递归、分治、贪心等,其技术价值在于为程序设计提供了高效的问题抽象与解决方案。在工程实践中,数据结构广泛应用于数据库索引、编译器设计、网络路由、操作系统调度等关键场景。对于备考重庆邮电大学802专业课的考生而言,深入理解严蔚敏版《数据结构》教材中的**算法思想**与**代码实现**细节,特别是掌 阅读详情

相关推荐

数据结构(十六) -- C语言版 -- 树 - 二叉树的线索化及遍历 -- 左指针域线索化、顺序表线索化、链表线索化

在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。

青椒*^_^*凤爪爪的博客 7123

树 --- 树的线索化

树为什么要线索化? 树如何线索化? 遍历线索树 1、树为什么要线索化?       n个结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。 2、树如何线索化(中序)? 以中序线索化为例 如果ptr-&gt;lchild为空,则存放指向中序遍历序列中该结点的前驱结点。这个结点称...

qq_41727218的博客 512

嵌入式充电协议深度解析:从QC到PD3.1的技术演进与实战应用

本文深入解析了从QC到PD3.1的嵌入式充电协议技术演进与实战应用。通过电压谈判、协议芯片设计、Type-C接口优化等关键技术,详细介绍了快充协议在嵌入式系统中的实现挑战与解决方案,包括兼容性测试、EMC问题处理及空间限制创新设计,为开发者提供了宝贵的实践经验。

weixin_29194817的博客 420

二叉树的详解与常见算法实现

文章目录一、 二叉树的基本概念 一、 二叉树的基本概念 **二叉树:**二叉树是每个节点最多有两个子树的树结构。 **根节点:**一棵树最上面的节点称为根节点。 父节点、子节点:如果一个节点下面连接多个节点,那么该节点称为父节点,它下面的节点称为子 节点。 **叶子节点:**没有任何子节点的节点称为叶子节点。 **兄弟节点:**具有相同父节点的节点互称为兄弟节点。 **节点度:**节点拥有的子树数。上图中,13的度为2,46的度为1,28的度为0。 **树的度:**所有结点的度数的最大值。二叉树的度小于等

weixin_39318565的博客 5061

Linux中Hadoop 集群搭建

零、下载Hadoop: http://archive.cloudera.com/cdh5/cdh/5/?tdsourcetag=s_pctim_aiomsg 一、集群规划: 搭建的 hadoop 集群由 3 台服务器组成,分别叫做 master,salve1 和 slave2。其中 master 作为主节点,slave1 和 slave2 作为从节点。 二、网络配置: 1.查看 3 个节点的主机名...

白墨的小白博客 3992

FPGA新手避坑指南:手把手教你搞定RTL8211千兆网PHY的时序配置(附Verilog代码)

本文详细解析了FPGA与RTL8211千兆网PHY芯片的时序配置问题,重点介绍了TXDLY/RXDLY引脚设置、FPGA发送端和接收端的Verilog实现,以及调试与验证的完整流程。通过硬件电路设计和代码示例,帮助开发者解决网络连接不稳定、丢包等常见问题,提升千兆网通信的稳定性。

weixin_28732953的博客 542

二叉树(详解)

二叉树(详解)

qq_68006585的博客 5186

Jetbrains IDE 配置上Gemini Code 插件,让你的的编程高效起飞~

Gemini Code Assist是 Google 家产品,基座模型为最新的Gemini 2.5 Pro。本篇实践了在 WebStrom 中Gemini Code Assist插件的高效编程。

2301_76993408的博客 4595

树及其应用c语言实现(数据结构复习最全笔记)(期末复习最新版)

树 一.树的基本概念 二.二叉树 1.二叉树的定义 2.二叉树的性质 此外在这里在介绍下完美二叉树的概念及重要性质 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 性质: (1)所有的叶结点都出...

markconca的博客 8927

6、核函数与再生核希尔伯特空间:原理、应用与实践

本文系统介绍了核函数与再生核希尔伯特空间(RKHS)的理论基础、核心性质及其在机器学习和信号处理中的广泛应用。文章从核方法的优势出发,阐述了其在非线性建模、正则化和算法核化方面的独特价值,并深入探讨了正定核、Mercer定理、表示定理等关键理论。通过构建多种标准核与工程专用核,展示了核函数的设计灵活性。结合支持向量回归(SVR)模型与多个MATLAB示例,详细说明了核方法的实际应用流程与操作技巧。最后,总结了核方法的应用领域、未来发展方向及学习实践建议,为读者提供了一套完整的理论与实践指南。

z2a3b4c5d的博客 144

YOLOv11改进 | Conv/卷积篇 | 轻量化多尺度异构卷积(MSHC)优化YOLOv11精度(全网独家首发)

本文介绍了Hype-YOLO提出的MANet结构,这是C3、C2f、C3k2的升级版,能显著增强特征提取能力。MANet整合了DSConv和C2f结构,通过多分支异构设计提升梯度流动和特征语义深度。文章详细解析了MSHC模块的原理,包括其多尺度并行建模、通道混洗等核心机制,并提供了完整的代码实现和训练教程。实验表明,Hype-YOLO的精度优于YOLOv11。该结构在保持轻量化的同时,通过异构分支设计实现了更丰富的特征表达,适用于目标检测等视觉任务。

Snu77的博客 952

第六章 树【数据结构和算法】

第六章 树(数据结构和算法)

小心星的博客 2918

37、基于视觉的轻量级面部呼吸和心率测量技术

本文提出了一种基于视觉的轻量级面部呼吸和心率测量技术,通过远程光电容积脉搏波描记法(RPPG)和面部振动信息实现非接触式生理信号采集。创新性地结合框选和特征点选择多个感兴趣区域(ROI),并采用光流跟踪、主成分分析(PCA)和集成经验模态分解(EEMD)等方法优化信号处理流程。实验结果表明,该方法在测量精度和稳定性方面优于传统方法,并可在树莓派4等低功耗平台上实现实时运行,具有广泛的应用前景。

r7s8t的博客 307

C语言数据结构(大话数据结构——笔记4)第六章:树

文章目录第六章:树(tree、root、subtree)(177)树的定义(179)结点分类(结点的度degree、叶结点leaf[终端结点]、分支结点[非终端节点]{内部结点}、树的度)(180)结点间关系(结点的孩子child、孩子的双亲parent、结点的兄弟sibling、结点的祖先、结点的子孙)(180)结点的层次level 树的深度{高度}depth 有序树、无序树 森林forest(181)树结构与线性结构对比(182)树的抽象数据类型(182)树的存储结构(183)双亲表示法(183)孩子表

Dontla的博客 1604

基于Simulink的新能源汽车热管理系统设计与仿真详细介绍

新能源汽车(如纯电动汽车和混合动力汽车)的热管理系统是确保电池、电机和电控系统高效运行的关键。通过合理设计热管理系统,可以提高车辆的续航里程、延长电池寿命并提升整体性能。以下是如何在 MATLAB 和 Simulink 中设计并仿真一个新能源汽车热管理系统的详细步骤。通过上述步骤,我们成功设计并实现了基于 Simulink 的新能源汽车热管理系统。该系统能够根据目标温度和实际反馈,通过 PID 控制器或模糊控制器调整冷却液流量、风扇转速等参数,实现对电池、电机和车内的精确温度控制。

xiaoheshang_123的博客 385

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据结构-用C语言描述耿国华版总结笔记(下篇)

第六章 树与二叉树 (一)二叉树 1.1树相关术语: 度(一个结点的子树个数);结点的层次(从该结点开始往下有多少层);树的度(树中所有结点的度的最大值);树的高度(树中所有结点的层次的最大值)。 1.2二叉树的性质: 1.二叉树...

云瀚的自习室 5651

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

考研 C与数据结构代码总结目录页

文章目录一、CC的应用位运算二、数据结构链表栈队列树图排序 前言:2019考研,我考的专业课是数据结构(含C语言程序设计),在考研备考期间,初学数据结构,感觉也是很曲折。刚开始复习看着每道题只有关键代码很头疼,为了保证自己的代码有同样的效果,不得不花很多时间去完善非重点部分的代码来完整运行起来,暑假写了挺多这种细枝末节的代码,也记录了一些放在我的Github上,不过没有整理目录,看着很乱,今天无意...

记录时光的脚步 1809

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

先序abdfcegh 中序bfdagehc 后序线索二叉树_数据结构| 第六章 树和二叉树

数组和广义表目录数组和广义表1.了解树和二叉树(满二叉树、完全二叉树)的基本概念、术语和性质。二叉树是度最大为2的有序树2.了解二叉树的顺序存储结构。3.熟练掌握二叉树的二叉链表存储结构及其实现。4.熟练掌握二叉树的先序、中序、后序和层次遍历算法。5.熟练掌握使用先序和中序(或中序和后序)两个遍历序列及标明空子树的先序遍历序列构造二叉树的方法。6.掌握二叉树中序遍历的非递归算法。7.了解...

weixin_36374366的博客 2366

凹入表形式打印树形结构C语言,树和二叉树-第6章-《数据结构题集》习题解析-严蔚敏吴伟民版...

习题集解析部分第6章 树和二叉树——《数据结构题集》-严蔚敏.吴伟民版相关测试数据下载 链接☛本习题文档的存放目录:数据结构▼配套习题解析▼06 树和二叉树文档中源码的存放目录:数据结构▼配套习题解析▼06 树和二叉树▼习题测试文档-06源码测试数据存放目录:数据结构▼配套习题解析▼06 树和二叉树▼习题测试文档-06Data一、基础知识题6.1❶已知一棵树的集合为{, , , , , , , ...

weixin_32801929的博客 3775

数据结构笔记

文章目录数据结构(基于C语言)第一章 单链表单链表的建立头插法尾插法带头结点的单链表按位序插入按位序删除删除指定节点不带头结点的单链表按位序插入按位序删除指定节点的后插操作指定节点的前插操作单链表的查找按位查找按值查找求单链表的长度第二章 双链表双链表的初始化(带头结点)双链表的插入双链表的删除双链表的遍历循环链表循环单链表循环双链表第三章 静态链表第四章 顺序表 VS 链表第五章 栈、队列和数组栈顺序栈的实现初始化栈进栈操作(增)出栈操作(删)和 读取栈顶元素操作(查)链式栈的实现栈的应用栈的应用--括号

weixin_52317620的博客 3031

c语言数据结构培训,数据结构教案c语言版培训资料.pdf

课程教案课程名称: 数据结构授课教师:学习对象:任课时间:一 、 学 生 情 况 分 析数据结构是计算机专业的一门核心专业课程。学生在前期的学习中已经学习了 C 语言程序设计课程。通过本课程学习使学生对提高编写程序的能力以及解决实际问题的能力。二 、 课 程 教 学 目标《数据...

weixin_39859819的博客 176

数据结构(C语言版)摘录--树和二叉树

第六章 树和二叉树 树(Tree)是n(n>=0)个结点的有限集。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,。。。,Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 森林(Forest)是m(m>=0)棵互不相交的树的集合。对树中每个结点而言,其子树的集

Hello World 2422

从零开始学数据结构系列之第六章《冒泡排序》

以上就是所有内容,对大家有用的话点个关注!之前C语言都学过,这里就简单的再讲一下。

铁匠匠匠的博客 1598

C语言数据查找教案,数据结构教案C语言版.doc

数据结构教案C语言版.doc课程教案 课程名称 数据结构 授课教师 学习对象 任课时间 一、 学生情况分析 数据结构是计算机专业的一门核心专业课程。学生在前期的学习中已经学习了 C语言程序设计课程。通过本课程学习使学生对提高编写程序的能力以及解决实际问题的能力。 二、 课程教学目标 数据结构是计算机 学科 中一门 核心 专业基础课。主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以...

weixin_36249618的博客 316

数据结构与算法基础-青岛大学-王卓

线性表循环链表。

Java后端技术栈 3403

从零开始学数据结构系列之第六章《排序简介》

​所谓排序,就是使一串数据,按照其中的某个或某些关键字的大小,递增或递减排列起来的操作。

铁匠匠匠的博客 1517
上一篇: unix环境高级编程第六章习题的一些拙见
下一篇: unix环境高级编程第七章习题的一些拙见
code_mlym
博客等级 码龄10年 27粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值