学习记录——day18 数据结构 树

news2024/9/20 18:37:54

树的存储

1、顺序存储

        对于普通的二叉树,不适合存储普通的二叉树顶序存储,一般用于存储完全二叉树而言,如果使用顺序存储,会浪费大量的存储空间,因为需要给没有节点的位置留出空间,以便于后期的插入。

        所以,一般使用链式存储。

2、链式存储

        

 3、二叉树的创建

1)节点类型创建

typedef char datatype;
//定义n节点类型
typedef struct Node
{
    datatype data;  //数据域
    struct Node* L; //左孩子指针
    struct Node* R; //右孩子指针
}Node,*BitreePtr;

2)创建二叉树

//创建二叉树
BitreePtr tree_create()
{
    char data = 0;           //节点数据
    scanf(" %c",&data);  //数据元素值
    if (data == '#')
    {
        return NULL;  //递归出口
    }

    //如果不是NULL需要申请节点
    BitreePtr p = (BitreePtr)malloc(sizeof(Node));
    if (NULL == p)
    {
        printf("节点申请失败\n");
        return NULL;
    }
    
    //将数据元素放入数据域中
    p->data = data;
    p->L = tree_create();  //递归创建左子树
    p->R = tree_create();  //递归创建右子树
     
    return p;              //返回创建好的树的地址 
}

3)先序遍历

//先序遍历
void prio_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    printf("%c\n",B->data);

    //先序遍历左子树
    prio_order(B->L);

    //先序遍历右子树
    prio_order(B->R);
    
}

4)中序遍历

//中序遍历
void in_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    //中序遍历左子树
    in_order(B->L);
    
    //输出数据域
    printf("%c\n",B->data);

    //中序遍历右子树
    in_order(B->R);
     
}

5)后序遍历

//后序遍历
void post_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    //后序遍历左子树
    post_order(B->L);

    //后序遍历右子树
    post_order(B->R);
    
    //输出数据域
    printf("%c\n",B->data);
}

6)完整代码

00.h

#ifndef DAY_18
#define DAY_18

#include <myhead.h>

typedef char datatype;
//定义n节点类型
typedef struct Node
{
    datatype data;  //数据域
    struct Node* L; //左孩子指针
    struct Node* R; //右孩子指针
}Node,*BitreePtr;

//创建二叉树
BitreePtr tree_create();

//先序遍历
void prio_order(BitreePtr B);

//中序遍历
void in_order(BitreePtr B);

//后序遍历
void post_order(BitreePtr B);
#endif // !DAY_18

00.c

#include "00.h"

//创建二叉树
BitreePtr tree_create()
{
    char data = 0;           //节点数据
    scanf(" %c",&data);  //数据元素值
    if (data == '#')
    {
        return NULL;  //递归出口
    }

    //如果不是NULL需要申请节点
    BitreePtr p = (BitreePtr)malloc(sizeof(Node));
    if (NULL == p)
    {
        printf("节点申请失败\n");
        return NULL;
    }
    
    //将数据元素放入数据域中
    p->data = data;
    p->L = tree_create();  //递归创建左子树
    p->R = tree_create();  //递归创建右子树
     
    return p;              //返回创建好的树的地址 
}

//先序遍历
void prio_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    printf("%c\n",B->data);

    //先序遍历左子树
    prio_order(B->L);

    //先序遍历右子树
    prio_order(B->R);
    
}

//中序遍历
void in_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    //中序遍历左子树
    in_order(B->L);
    
    //输出数据域
    printf("%c\n",B->data);

    //中序遍历右子树
    in_order(B->R);
     
}

//后序遍历
void post_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    //后序遍历左子树
    post_order(B->L);

    //后序遍历右子树
    post_order(B->R);
    
    //输出数据域
    printf("%c\n",B->data);
}

main.c

#include "00.h"

int main(int argc, char const *argv[])
{
    BitreePtr B = tree_create();
    if (NULL == B)
    {
        return -1;
    }

    printf("prio_order:\n");
    prio_order(B);

    printf("in_order:\n");
    in_order(B);

    printf("post_order:\n");
    post_order(B);
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot循环依赖的解决方式

Springboot循环依赖的解决方式 起因原因解决方案配置文件解决使用工具类获取bean还有一种我设想的方案 起因 今天重构代码时&#xff0c;发现之前的代码结构完全混乱&#xff0c;没有按照MVC分层思想去编写&#xff0c;很多业务逻辑写在了controller中&#xff0c;导致引用的很…

WebStorm中在Terminal终端运行脚本时报错无法加载文件进行数字签名。无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息,请参阅

错误再现 我们今天要 在webstorm用终端运行脚本 目的是下一个openAPI的 前端请求代码生成的模块 我们首先从github上查看官方文档 我们根据文档修改 放到webstorm终端里执行 报错 openapi : 无法加载文件 C:\Users\ZDY\Desktop\多多oj\dduoj\node_modules\.bin\openapi.p…

LabVIEW多种测试仪器集成控制系统

在现代工业生产与科研领域&#xff0c;对测试设备的需求日益增长。传统的手动操作测试不仅效率低下&#xff0c;而且易出错。本项目通过集成控制系统&#xff0c;实现了自动化控制&#xff0c;降低操作复杂度和错误率&#xff0c;提高生产和研究效率。 系统组成与硬件选择 系…

逆向软件更新 x64dbg 加入 windows api 函数设断点插件

百度网盘链接&#xff1a;https://pan.baidu.com/s/1VaGP0rN8uTf8j_SzBgaEPg?pwd6666

Docker容器限制内存与CPU使用

文章目录 Docker 容器限制内存与 CPU 使用内存限额内存限制命令举例使用 `nginx` 镜像学习内存分配只指定 `-m` 参数的情况CPU 限制命令举例验证资源使用Docker 容器限制内存与 CPU 使用 在生产环境中,为了保证服务器不因某一个软件导致服务器资源耗尽,我们会限制软件的资源…

用uniapp 及socket.io做一个简单聊天app 2

在这里只有群聊&#xff0c;二个好友聊天&#xff0c;可以认为是建了一个二人的群聊。 const express require(express); const http require(http); const socketIo require(socket.io); const cors require(cors); // 引入 cors 中间件const app express(); const serv…

学术研讨 | 区块链治理与应用创新研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心组织&#xff0c;长安链开源社区支持的“区块链治理与应用创新研讨会”顺利召开&#xff0c;会议围绕区块链治理全球发展现状、研究基础、发展趋势以及区块链行业应用创新展开研讨。北京大学陈钟教授做了“区块链治理与应用创…

我们的人生,向阳而生,去更远的地方,见更亮的光

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140683410 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

qt SQLite学习记录

1. 查看qt中数据库的驱动的类型的支持 QStringList drivers QSqlDatabase::drivers();//获取qt中所支持的数据库驱动类型foreach(QString driver,drivers){qDebug()<<driver;}2. Qt SQL 模块包含的主要类的功能介绍 Qt SQL 模块包含了一些主要的类&#xff0c;用于在 …

自动驾驶系统开发与调试:车路云一体化无人驾驶挑战赛参赛体验

点击蓝字 关注我们 在过去的几年里&#xff0c;自动驾驶技术在全球范围内吸引了大量关注。其潜力不仅在于提升行车安全&#xff0c;而且还可以改变我们的出行方式和城市规划&#xff0c;提高交通运输效率。国际汽车工程师学会&#xff08;SAE&#xff09;根据不同自动驾驶程度&…

Linux中,MySQL数据库管理

使用MySQL数据库 查看数据库结构 MySQL是一套数据库管理系统&#xff0c;在每台MySQL服务器中&#xff0c;均支持运行多个数据库&#xff0c;每个数据库相当于一个容器&#xff0c;其中存放着许多表&#xff0c;如图2.1所示。 下面分别介绍查看数据库、表结构的相关操作语句。…

单片机原理及技术(四)—— C51语言程序设计基础(C51编程)

目录 一、C51语言中的数据类型与存储类型 1.1 数据类型 1.2 C51语言的扩展数据类型 1.3 数据存储类型 1.4 数据存储模式 二、C51语言的特殊寄存器及变量定义 2.1 特殊功能寄存器的C51语言定义 2.1.1 使用关键字定义sfr 2.1.2 使用头文件访问SFR 2.1.3 特殊功能寄存器…

《梦醒蝶飞:释放Excel函数与公式的力量》18.1 图表类型与设计

第18章&#xff1a;创建图表和数据可视化 18.1 图表类型与设计 Excel提供了多种图表类型&#xff0c;帮助用户以直观的方式展示数据。选择合适的图表类型和设计可以显著提高数据的可读性和理解度。以下将介绍常见的图表类型及其应用&#xff0c;并通过具体案例进行说明。 18.…

无人机制造工艺流程详解

一、需求分析 无人机制造的第一步是需求分析。这一阶段主要明确无人机的使用场景、功能要求、性能指标以及成本预算等。通过与客户或项目团队的深入沟通&#xff0c;确保对无人机的需求有全面而准确的理解。同时&#xff0c;也需要进行市场调研&#xff0c;了解同类型产品的特…

达梦数据库系列—31. 事务和锁

目录 事务 事务的状态 事务的四种隔离级别ACID 锁 锁粒度 锁等待与死锁 锁查看 锁处理 事务 数据库事务是指作为单个逻辑工作单元的一系列操作的集合。 事务的状态 NOT_START 未启动 ACTIVE 活动 LOCK_WAIT 锁等待 TRX4_PRE_COMMIT 预提交 事务ID(事务号)&…

llamaindex+Internlm2 RAG实践

llamaindexInternlm2 RAG实践 环境、模型准备 进入开发机后&#xff0c;从官方环境复制运行 InternLM 的基础环境&#xff0c;命名为 llamaindex&#xff0c;在命令行模式下运行&#xff1a; conda create -n llamaindex python3.10运行 conda 命令&#xff0c;激活 llamain…

IP地址专用SSL证书申请指南——六步完成

IP地址SSL证书是一种专门设计用于IP地址的SSL/TLS证书&#xff0c;部署IP地址SSL证书可以实现IP地址HTTPS加密。 一&#xff1a;前提条件 1&#xff1b;申请IP地址SSL证书,必须拥有这个IP地址的管理权限 2&#xff1b;非内网IP&#xff0c;以下是常见的内网IP字段 10.0.0.0…

Mindspore框架循环神经网络RNN模型实现情感分类|(三)RNN模型构建

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…

松下UV电源MID SONIC600 ANUP8304NAIS电源设备更新换下的

松下UV电源MID SONIC600 ANUP8304NAIS电源设备更新换下的

JL 跳转指令的理解

一般情况下&#xff0c;JU 和 JC 是最常见的跳转指令&#xff1b;但有时会用到JL 指令&#xff0c;JL 说起来更像是一组指令&#xff0c;类似C,C# 语言中的 switch case 语句&#xff0c;但是有个明显的不同&#xff0c;前者的判断条件可以是任意合理数字&#xff0c;后者范围…