【数据结构】【王道】【树与二叉树】中序二叉线索树的实现及基本操作(可直接运行)

ESP32锂电池电量检测实战:从引脚选择到低功耗优化(附完整电路图) 本文详细介绍了ESP32锂电池电量检测的实战方案,从ADC引脚选择到低功耗优化,提供完整的电路图和代码实现。通过MOS管智能开关和深度睡眠技术,显著降低静态功耗至0.5μA,提升设备续航能力。适合物联网开发者解决电量检测中的常见问题。 阅读详情

总目录:https://blog.youkuaiyun.com/treesorshining/article/details/125726400

1.概述

在含有n个结点的二叉树中,有n+1个空指针,即每个度为1的结点有一个空指针,每个叶子结点有两个空指针,这就造成了空间的浪费。可以通过一些方法将这些空指针充分利用起来,即将这些空指针改成指向前驱或后继的线索,可以视为在原本的二叉树上用空指针建立一个线索链表,加上了线索的二叉树也可称为线索二叉树。

2.基本操作

2.1 结构体构造

// 线索二叉树结点
typedef struct ThreadNode {
    char data;  // 数据域
    // 左孩子、右孩子
    struct ThreadNode *lchild, *rchild;
    // 左、右线索标志
    // tag==0表示指针指向孩子
    // tag==1表示指针指向线索
    int ltag, rtag;
} ThreadNode, *ThreadTree;

// 全局变量pre,指向当前访问结点的前驱
ThreadNode *pre = NULL;

2.2 初始化

建立一个根节点,同时将左右孩子指针置空,将左右tag设为0。

// 初始化
void InitTree(ThreadNode* &T) {
    // 初始化可将根节点置空,空树
    T = NULL;
    // 插入根节点
    // 分配空间
    T = (ThreadNode*)malloc(sizeof(ThreadNode));
    // 赋值
    T->data = 'A';
    // 初始tag设为0
    T->ltag = 0;
    T->rtag = 0;
    // 初始无左右子树
    T->lchild = NULL;
    T->rchild = NULL;
}

2.3 左插入结点

与一般二叉树插入类似,不过要注意修改tag的值。

// 左插入结点
bool InsertLeftTreeNode(ThreadNode* &T, char x) {
    // 分配空间
    ThreadNode *p = (ThreadNode*)malloc(sizeof(ThreadNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 将tag值设为0
    p->ltag = 0;
    p->rtag = 0;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->lchild = p;
    return true;
}

2.4 右插入结点

与一般二叉树插入类似,不过要注意修改tag的值。

// 右插入结点
bool InsertRightTreeNode(ThreadNode* &T, char x) {
    // 分配空间
    ThreadNode *p = (ThreadNode*)malloc(sizeof(ThreadNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 将tag值设为0
    p->ltag = 0;
    p->rtag = 0;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->rchild = p;
    return true;
}

2.5 访问结点并建立线索

遍历中访问结点,在遍历的同时建立前驱及后继线索。

// 用于访问结点
void visit(ThreadNode *q) {
    // 左子树为空,建立前驱线索
    if(q->lchild == NULL) {
        // 令其左指针指向前驱
        q->lchild = pre;
        // 将tag值修改为1,表示此处左指针指向的是前驱,即左孩子指针是线索
        q->ltag = 1;
        if(pre != NULL) {
            printf("建立前驱线索:%c-->%c\n", q->data, pre->data);
        } else {
            printf("建立前驱线索:%c-->%s\n", q->data, "NULL");
        }
    }
    // 设立后继线索时前驱不能为空(无前驱无法建立后继)
    // 右孩子指针为空,表示可以建立后继线索
    if(pre != NULL && pre->rchild == NULL) {
        // 建立前驱结点的后继线索
        pre->rchild = q;
        // 将tag值修改为1,表示此处右指针指向的是后继,即右孩子指针是线索
        pre->rtag = 1;
        printf("建立后继线索:%c-->%c\n", pre->data, q->data);
    }
    // 线索建立完成后,前驱指针移动,指向当前指向结点处
    pre = q;
}

2.6 中序遍历二叉树并建立线索

实际上就是进行中序遍历,一边遍历一边线索化,因为想得到一个结点的前驱或者后继,只能在遍历时取得。

// 中序线索化二叉树
// 实际上就是进行中序遍历,一边遍历一边线索化
// 因为想得到一个结点的前驱或者后继,只能在遍历时取得
// 线索化在visit函数中完成
void InThread(ThreadTree T) {
    if(T != NULL) {
        InThread(T->lchild);
        visit(T);
        InThread(T->rchild);
    }
}

2.7 中序线索化二叉树

// 中序线索化二叉树
void CreateInThread(ThreadTree T) {
    // pre初始为NULL
    pre = NULL;
    // 若二叉树为空,则不可线索化
    if(T != NULL) {
        // 中序线索化二叉树
        InThread(T);
        // 对于最后一个结点的处理
        // 由于访问完成后,pre和p都指向最后一个结点
        // 按照线索化的要求,如果最后一个结点右孩子指向NULL,则可视为其有后继结点
        // 应将tag设为1
        if(pre->rchild == NULL) {
            pre->rtag = 1;
            printf("建立后继线索:%c-->%s\n", pre->data, "NULL");
        }
    }
}

2.8 找到第一个被中序遍历的结点

找到以p为根的子树中,第一个被中序遍历的结点。

// 找到以p为根的子树中,第一个被中序遍历的结点
// 即后继结点
ThreadNode *FirstNode(ThreadNode *p) {
    // 循环找到最左下结点(不一定是叶子结点)
    // 当ltag==0时,说明其线索二叉树此结点不存在左线索,那么一定有左子树
    while(p->ltag == 0) {
        p = p->lchild;
    }
    return p;
}

2.9 在中序线索二叉树中找到某一结点的后继结点

要找到一个结点的后继,如果右孩子指针tag==1,直接用线索即可,如若不为1,那么就要根据中序遍历的特点来寻找后继结点,即左根右。如果该结点有右孩子且右孩子为叶子结点,那么这就是其后继结点,如果该节点有右孩子,且为分支结点,那么后继结点就应该是该节点右子树的最左下结点。

// 在中序线索二叉树中找到结点p的后继结点
// 要找到一个结点的后继,如果右孩子指针tag==1,直接用线索即可
// 如若不为1,那么就要根据中序遍历的特点来寻找后继结点,即左根右
// 如果该结点有右孩子且右孩子为叶子结点,那么这就是其后继结点
// 如果该节点有右孩子,且为分支结点,那么后继结点就应该是该节点右子树的最左下结点
// 注意:若没有线索,则一定存在右子树(根据线索二叉树特点)
ThreadNode *NextNode(ThreadNode *p) {
    // 如果右孩子结点无线索
    if(p->rtag == 0) return FirstNode(p->rchild);
    // 如果右孩子结点有线索则直接利用线索找到结点即可
    else return p->rchild;
}

2.10 利用中序线索树完成非递归中序遍历

// 对中序线索二叉树进行中序遍历(利用线索非递归实现)
// 首先找到根节点最左下结点,访问之后,通过NextNode函数找后继结点访问即可
void InOrder(ThreadNode *T) {
    for(ThreadNode *p = FirstNode(T);p != NULL;p = NextNode(p)) {
        visit1(p);
    }
}

3.完整代码

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

// 线索二叉树结点
typedef struct ThreadNode {
    char data;  // 数据域
    // 左孩子、右孩子
    struct ThreadNode *lchild, *rchild;
    // 左、右线索标志
    // tag==0表示指针指向孩子
    // tag==1表示指针指向线索
    int ltag, rtag;
} ThreadNode, *ThreadTree;

// 全局变量pre,指向当前访问结点的前驱
ThreadNode *pre = NULL;

// 初始化
void InitTree(ThreadNode* &T) {
    // 初始化可将根节点置空,空树
    T = NULL;
    // 插入根节点
    // 分配空间
    T = (ThreadNode*)malloc(sizeof(ThreadNode));
    // 赋值
    T->data = 'A';
    // 初始tag设为0
    T->ltag = 0;
    T->rtag = 0;
    // 初始无左右子树
    T->lchild = NULL;
    T->rchild = NULL;
}

// 左插入结点
bool InsertLeftTreeNode(ThreadNode* &T, char x) {
    // 分配空间
    ThreadNode *p = (ThreadNode*)malloc(sizeof(ThreadNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 将tag值设为0
    p->ltag = 0;
    p->rtag = 0;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->lchild = p;
    return true;
}

// 右插入结点
bool InsertRightTreeNode(ThreadNode* &T, char x) {
    // 分配空间
    ThreadNode *p = (ThreadNode*)malloc(sizeof(ThreadNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 将tag值设为0
    p->ltag = 0;
    p->rtag = 0;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->rchild = p;
    return true;
}

// 用于访问结点
void visit(ThreadNode *q) {
    // 左子树为空,建立前驱线索
    if(q->lchild == NULL) {
        // 令其左指针指向前驱
        q->lchild = pre;
        // 将tag值修改为1,表示此处左指针指向的是前驱,即左孩子指针是线索
        q->ltag = 1;
        if(pre != NULL) {
            printf("建立前驱线索:%c-->%c\n", q->data, pre->data);
        } else {
            printf("建立前驱线索:%c-->%s\n", q->data, "NULL");
        }
    }
    // 设立后继线索时前驱不能为空(无前驱无法建立后继)
    // 右孩子指针为空,表示可以建立后继线索
    if(pre != NULL && pre->rchild == NULL) {
        // 建立前驱结点的后继线索
        pre->rchild = q;
        // 将tag值修改为1,表示此处右指针指向的是后继,即右孩子指针是线索
        pre->rtag = 1;
        printf("建立后继线索:%c-->%c\n", pre->data, q->data);
    }
    // 线索建立完成后,前驱指针移动,指向当前指向结点处
    pre = q;
}

// 中序线索化二叉树
// 实际上就是进行中序遍历,一边遍历一边线索化
// 因为想得到一个结点的前驱或者后继,只能在遍历时取得
// 线索化在visit函数中完成
void InThread(ThreadTree T) {
    if(T != NULL) {
        InThread(T->lchild);
        visit(T);
        InThread(T->rchild);
    }
}

// 中序线索化二叉树
void CreateInThread(ThreadTree T) {
    // pre初始为NULL
    pre = NULL;
    // 若二叉树为空,则不可线索化
    if(T != NULL) {
        // 中序线索化二叉树
        InThread(T);
        // 对于最后一个结点的处理
        // 由于访问完成后,pre和p都指向最后一个结点
        // 按照线索化的要求,如果最后一个结点右孩子指向NULL,则可视为其有后继结点
        // 应将tag设为1
        if(pre->rchild == NULL) {
            pre->rtag = 1;
            printf("建立后继线索:%c-->%s\n", pre->data, "NULL");
        }
    }
}

// 找到以p为根的子树中,第一个被中序遍历的结点
// 即后继结点
ThreadNode *FirstNode(ThreadNode *p) {
    // 循环找到最左下结点(不一定是叶子结点)
    // 当ltag==0时,说明其线索二叉树此结点不存在左线索,那么一定有左子树
    while(p->ltag == 0) {
        p = p->lchild;
    }
    return p;
}

// 在中序线索二叉树中找到结点p的后继结点
// 要找到一个结点的后继,如果右孩子指针tag==1,直接用线索即可
// 如若不为1,那么就要根据中序遍历的特点来寻找后继结点,即左根右
// 如果该结点有右孩子且右孩子为叶子结点,那么这就是其后继结点
// 如果该节点有右孩子,且为分支结点,那么后继结点就应该是该节点右子树的最左下结点
// 注意:若没有线索,则一定存在右子树(根据线索二叉树特点)
ThreadNode *NextNode(ThreadNode *p) {
    // 如果右孩子结点无线索
    if(p->rtag == 0) return FirstNode(p->rchild);
    // 如果右孩子结点有线索则直接利用线索找到结点即可
    else return p->rchild;
}

// 访问结点
void visit1(ThreadNode *T) {
    printf("%c   ", T->data);
}

// 对中序线索二叉树进行中序遍历(利用线索非递归实现)
// 首先找到根节点最左下结点,访问之后,通过NextNode函数找后继结点访问即可
void InOrder(ThreadNode *T) {
    for(ThreadNode *p = FirstNode(T);p != NULL;p = NextNode(p)) {
        visit1(p);
    }
}

// 找到以p为根的子树中最后一个被中序遍历的结点
// 即前驱结点
ThreadNode *LastNode(ThreadNode *p) {
    // 循环找到最右下结点(不一定为叶子结点)
    // 当rtag==0时,说明其线索二叉树此结点不存在右线索,那么一定有右子树
    while(p->rtag == 0) {
        p = p->rchild;
    }
    return p;
}

// 在中序线索二叉树中找到结点p的前驱结点
// 要找到一个结点的前驱,如果左孩子指针tag==1,直接用线索即可
// 如若不为1,那么就要根据中序遍历的特点来寻找前驱结点,即左根右
// 即应该找到其左子树中遍历的最后一个结点,即左子树最右下结点,那即是其前驱结点
// 注意:若没有线索,则一定存在左子树(根据线索二叉树特点)
ThreadNode *PreNode(ThreadNode *p) {
    // 左子树中最右下结点
    if(p->ltag == 0) {
        return LastNode(p->lchild);
    } else {
        // 如果右孩子结点有线索则直接利用线索找到结点即可
        return p->lchild;
    }
}

int main() {
    ThreadTree T;
    InitTree(T);
    InsertLeftTreeNode(T, 'B');
    InsertRightTreeNode(T, 'C');
    InsertLeftTreeNode(T->lchild, 'D');
    InsertRightTreeNode(T->lchild, 'E');
    InsertLeftTreeNode(T->rchild, 'F');
    InsertRightTreeNode(T->rchild, 'G');
    CreateInThread(T);
    printf("InOrder\n");
    InOrder(T);
}

4.运行结果

在这里插入图片描述

【VisionMaster】图像源模块之本地图像 图像采集之图像源 阅读详情

相关推荐

避坑指南:C#用S7NetPlus读写西门子PLC字符串(String/WString)的完整方案

本文详细解析了C#通过S7NetPlus读写西门子PLC字符串(String/WString)的完整方案,包括内存布局、编码差异和字节序处理等关键技术细节。提供了实战优化的代码示例和常见问题排查指南,帮助开发者避免乱码、截断等常见陷阱,提升工业自动化项目的开发效率。

weixin_32956805的博客 320

7-2 线索二叉树的建立和遍历

本题要求实现对建立中序线索二叉树和中序遍历中序线索二叉树。 输入格式: 输入为先序序列 输出格式: 输出为中序遍历线索树的结点值以及结点的左右指针信息。 输入样例: 在这里给出一组输入。例如: AB@D@@CE@@@ 输出样例: B 1 0 D 1 1 A 0 0 E 1 1 C 0 1 ...

xxysssss的博客 3141

机器学习之性能度量

废话不说,本文分为两个部分: 第一部分,我对周志华教授《机器学习》这本书中性能度量知识点中疑难点的学习感悟;第二部分,我感觉该书2.3节 性能度量 中最后部分的代价曲线表述有误,苦于没找到联系教授的正确方式,故希望与广大网友一起探讨。

hustqb的博客 4628

中序线索二叉树的创建、线索化和遍历

【问题描述】创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树 【编码要求】线索二叉树遍历过程中不能使用递归、不能使用栈。 【输入形式】二叉树拓展的前序遍历序列 【输出形式】中序遍历序列 【样例输入】AB#D##CE### 【样例输出】BDAEC 审题: 题目一共有三个小问: 1.创建一颗二叉树。 2.中序线索化该二叉树。 3.基于设置好的线索,中序遍历该二叉树。 那么下面,我们逐个击破这些问题。 首先,创建一颗二叉树。 以一个结构体封装好一个线索

huhubbdd的博客 1368

Ubuntu下安装Hive3.1.2教程(附MySQL安装方法及安装包)

文章目录前言一、安装Hive1. 下载压缩包并解压2. 安装Hive3. 配置环境变量4. 修改配置文件二、MySQL安装与配置1. 安装MySQL2. 安装MySQL jdbc包3. 为Hive创建MySQL账号三、验证Hive安装及错误处理1. 启动Hadoop2. 启动hive3. 运行Hive实例总结 前言 Hive 的安装需要建立在 Hadoop 的之上(类似于Hbase),关于 Hadoop 的单机安装以及伪分布式安装可以参考作者的另两篇博客: Ubuntu下单机安装Hadoop详细教程(附

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 1万+

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1340

实验3 二叉树的基本操作、算法和应用

检查栈,若栈不空,出栈,先访问左孩子,左孩子不为空则输出,再检查右孩子,有右孩子则入栈,再继续访问左分支。如果左分支不空,则沿着左分支一直下行,经过的结点进栈,直到沿着左分支深入不下去时检查右分支,如果右分支不为空,接着进入右分支。如果该结点的右标志位不是线索,则右指针指向该结点的右子树的根结点,根据中序遍历的定义,该结点的后继是右子树的最左下结点。如果p的右孩子不为空,入栈。素,并访问出栈的元素,接着进入出栈结点的右分支,此时检查出栈结点的右分支以及栈是否为空,如果都为空算法结束,否则重复上述过程。

AZXYZNPY的博客 938

AUTOSAR进阶图解==>AUTOSAR_EXP_VFB

AUTOSAR虚拟功能总线(VFB)摘要 AUTOSAR虚拟功能总线(VFB)是汽车开放系统架构中的核心抽象概念,为分布式电子系统提供统一通信模型。VFB允许软件组件在不了解底层物理通信机制的情况下交互,通过运行时环境(RTE)实现组件间的数据交换。系统配置过程将抽象的VFB视图转换为具体实现,包括组件到ECU的映射和通信机制选择。VFB采用"last-is-best"语义进行数据通信,并支持模式管理机制,使组件能根据系统状态调整行为。此外,VFB还支持与非AUTOSAR系统的交互,通常

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1117

PTA数据结构练习题——树与二叉树

本题要求实现对建立中序线索二叉树和中序遍历中序线索二叉树。

m0_74369696的博客 316

【swjtu】算法实验2.4分析算法时间复杂度

分析给定算法的时间复杂度。 上机实验,绘制不同输入情况下的运行时间曲线,并与(1)中的分析结果进行比较。 撰写相应的实验报告,实验报告内容包括:实验目的、实验任务、 实验环境、实验步骤、实验结果及其分析以及实验总结等部分内容。

qq_52046937的博客 731

基于截图详解:SAP GUI for Java 如何设置登录链接,以及 conn= 连接字符串该怎么写

摘要:SAP GUI for Java 的连接属性配置关键是在"高级"页签的"conn="后填写连接字符串。连接字符串格式取决于网络拓扑:直连应用服务器使用"/H/主机/S/端口";通过消息服务器负载均衡使用"/M/消息服务器/S/端口/G/组名";经SAProuter访问则需添加路由器前缀。配置时需注意专家模式会覆盖其他页签设置,且连接字符串还支持附加参数如客户端、语言和默认事务码。具体填写内容应根据Basis团队提供的系统信

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 251

7-2 线索二叉树的建立和遍历 (PTA-数据结构)

本题要求实现对建立中序线索二叉树和中序遍历中序线索二叉树。

FellAveal的博客 2119

YOLOv11改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用

本文记录的是利用优化的目标检测方法研究。深度可分离卷积可以减少FLOPs,但会导致更高的内存访问,引起延迟并减慢整体计算。部分卷积利用逐点卷积处理通道冗余,减少模型计算量和内存访问量。Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks的实现代码如下: 四、创新模块 4.1 改进点⭐ 模块改进方法: 1️⃣ 加入。添加后如下:2️⃣:加入基于的。利用改进模块,减少通道冗余。改进代码如下:首先添加如下代码让加入,并重命名为 再添加如

Limiiiing的博客 3875

【数据结构】【王道】【数据结构实现】文章目录

数据结构实现文章目录

treesorshining的博客 1915

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

王道数据结构2-6章数据结构存储结构定义及基本操作

王道数据结构2-6章数据结构存储结构定义及基本操作

qq_46264636的博客 1174

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

王道ch4-BiTree-中序遍历线索化二叉树,线索二叉树的中序遍历

//任务:已知先序遍历中序遍历构造二叉树 ThreadTree preInCreate(int A[], int startA, int endA, int B[], int startB, int endB) { int i, llen, rlen; ThreadTree root = (ThreadTNode*)malloc(sizeof(ThreadTNode)); root-&gt...

比尔·盖薇的博客 471

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

算法演示可以参见这里: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 * 二叉树线索化的目的是更好

ilikeprograming的专栏 695

二叉树的基本操作、算法和应用

一、实验目的 掌握二叉树的建立和遍历 掌握二叉树遍历的应用 掌握线索二叉树的建立和遍历 掌握hufmman编码 二、实验内容 递归建立和层次遍历二叉树 二叉树的深度非递归遍历 统计二叉树中右孩子节点的个数 线索二叉树的建立和遍历 哈夫曼编码 三、实验环境 在PTA平台进行实验 四、实验要求 根据每个实训的要求完成代码提交和测评 五、实验步骤 描述算法的原理或实现流程(测评完全正确或部分正确的实训) 1.递归建立和层次遍历二叉树 题目:本题要求编写建立二叉树的函数和层次

qq_45721890的博客 1296

C语言中序线索二叉树的建立及遍历

#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef char elemType; typedef struct BiTNode { elemType data; struct BiTNode *lchild, *rchild; int LTag, RTag...

记录学习点滴 9330

【数据结构】第5章 树和二叉树 实验6:中序线索二叉树的创建与遍历

【线索二叉树的中序创建、先序中序后序遍历】实验报告+完整代码

wwr's study notes 1481

【C语言】线索二叉树 实现先序创建+中序线索化+递归中序遍历+非递归中序遍历

重点是怎么利用指针域,搞清楚LTag和RTag是什么,以及整个线索树怎么完整连接起来。循环的判断是一个难点。

祁许的博客 1466

线索二叉树——中序遍历对二叉树线索化、对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)、对中序线索二叉树进行逆向中序遍历(利用线索实现的非递归算法)、先序遍历对二叉树线索化等操作(王道版)

线索二叉树——中序遍历对二叉树线索化、对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)、对中序线索二叉树进行逆向中序遍历(利用线索实现的非递归算法)、先序遍历对二叉树线索化等操作(王道版)......

a1833235073的博客 2682

1数据结构练习题

【代码】1数据结构练习题。

2301_78367631的博客 268

中序遍历线索二叉树

中序遍历线索二叉树的实现与操作二叉线索树的结构定义创建一棵二叉树创建一棵二叉树及二叉树基本操作中序遍历二叉树线索化的递归算法通过中序遍历建立中序线索二叉树中序遍历主函数测试 二叉线索树的结构定义 typedef enum{Link, Thread}PointerTag; typedef struct ThreadNode { char data; ThreadNode *lchil...

Stone 1878

构造中序线索二叉树和先序线索二叉树,中序线索二叉树找寻前驱结点和后继结点,包含完整代码

构造中序线索二叉树和先序线索二叉树,中序线索二叉树找寻前驱结点和后继结点,包含完整代码

m0_75220252的博客 912

王道数据结构第五章:树与二叉树

二叉树是指n(n>=0)个结点的有限集合。1)或者为空二叉树,即n=0;2)或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别 是一棵二叉树。特点:二叉树每个结点最多只有两棵子树,左右子树顺序不能颠倒(二叉树是有序树二叉树的五个状态:空二叉树 只有左子树 只有右子树 只有根节点 左右子树都有。

weixin_74776795的博客 777

王道数据结构代码——二叉树

王道数据结构代码——二叉树

qq_53381910的博客 1317
上一篇: 【数据结构】【王道】【树与二叉树】二叉树非递归遍历的实现(可直接运行)
下一篇: 【数据结构】【王道】【树与二叉树】并查集的实现及优化(可直接运行)
Silver  Star
Silver Star 新星创作者: 大数据技术领域 新星创作者: 大数据技术领域
博客等级 码龄7年 1万+粉丝 72原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silver Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值