数据结构 ——树状存储的实现

news2024/12/13 12:33:58

数据结构 ——树状存储的实现

1、树的遍历
按层遍历:从树的根节点开始,逐层遍历树中的所有节点。这种遍历方式也称为广度优先遍历。

先序遍历(前序遍历):先访问根节点,然后递归地先序遍历左子树,最后递归地先序遍历右子树。

中序遍历:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。

后序遍历:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。

先序和中序 /中序和后序 能确定一颗树

下面为各种遍历示意图
在这里插入图片描述
2、代码实现
下面是以递归的思想来构建和遍历一颗二叉树

#include<stdio.h>
#include<stdlib.h>
#define NAMESIZE 32
//以无头节点的链表构建二叉树
struct score_st
{
    int id;
    char name[NAMESIZE];
    int math;
    int chinese;
};
struct node_st
{
    struct score_st data;
    struct node_st *l,*r;
};
void print_s1(struct score_st *d)
{
    printf("%d %s %d %d\n",d->id,d->name,d->math,d->chinese);
}
//插入原则:比当前节点小的插入左子树,比节点大的插入右子树 
int insert(struct node_st **root,struct score_st *data)
{
    struct node_st *node;
    //走到空节点或叶子节点
    if(*root==NULL)
    {
        node=(struct node_st*)malloc(sizeof(struct node_st));
        if(node==NULL)
            return -1;
        node->data=*data;
        node->l=NULL;//防止野指针的出现
        node->r=NULL;
        *root=node;//根节点指向创建出来的新节点,后面递归时root为传入的左或右子树的指针
        return 0; 
    }
    //比当前节点小的插入左子树,比节点大的插入右子树,递归遍历
    if(data->id<=(*root)->data.id)
     return insert(&(*root)->l,data);
    return insert(&(*root)->r,data);
}
struct score_st *find(struct node_st *root,int id)
{
    //传过来的节点为叶子节点空的左或右孩子,说明走到了一个不存在的分支
    if(root==NULL)
        return NULL;
    if(id==root->data.id)
        return &(root->data);
    //传进来的id比当前节点小,往左子树找
    if(id<root->data.id)
        return find(root->l,id);
    //传进来的id比当前节点大,往右子树找
    return find(root->r,id);
}
void draw_(struct node_st *root,int level)
{
    /*往左边倒,画出树的结构,先画当前节点的右子树,再跟节点,最后
      root->r
      root
      root->l
    */
   if(root==NULL)
       return; //空节点或空的叶子结点
   //先画右子树,右子树不止一层,所以递归调用,画右子树的右子树(当前层的下一层)
    draw_(root->r,level+1);
    //画空格,即当前节点前面的空格
    for(int i=0;i<level;i++)
        printf("  ");
    //画根节点
    print_s1(&root->data);
    //画左子树
    draw_(root->l,level+1);

}
void draw(struct node_st *root)
{
    //根据层数画出树和空格
    draw_(root,0);
}
int main()
{
    int arr[]={1,2,3,7,6,5,9,8,4};
    int i;
    struct node_st *tree=NULL;
    struct score_st tmp,*datap;
    for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
    {
        tmp.id=arr[i];
        snprintf(tmp.name,NAMESIZE,"stu%d",arr[i]);
        tmp.math=rand()%100;
        tmp.chinese=rand()%100;
        //无头节点要改变指针的指向,传二级指针
        insert(&tree,&tmp);
    }
    draw(tree);
    #if 0
    //查找测试
    int tmpid=1;
    datap=find(tree,tmpid);
    if(datap==NULL)
        printf("Can not find the id %d!\n",tmpid);
    else 
        print_s1(datap);
    #endif
    return 0;
}

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

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

相关文章

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 单图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 单图推理 flyish 输入 输出 [‘这是一幅中国传统山水画&#xff0c;描绘了一座高耸的山峰&#xff0c;周围环绕着树木和植被。画面下方有一片开阔的田野&#xff0c;远处的山峦在薄雾中若隐若现。画面上方有几行书法…

Docker 安装 Jenkins:2.346.3

准备&#xff1a;已安装Docker&#xff0c;已配置服务器安全组规则 1581 1、拉取镜像 [rootTseng ~]# docker pull jenkins/jenkins:2.346.3 2.346.3: Pulling from jenkins/jenkins 001c52e26ad5: Pull complete 6b8dd635df38: Pull complete 2ba4c74fd680: Pull complet…

AWS re:Invent 发布新的数据库产品 Aurora DSQL; NineData SQL编程大赛开始; 腾讯云支持PostgreSQL 17

重要更新 1. AWS re:Invent 发布新的数据库产品 Aurora DSQL &#xff0c;提供了跨区域、强一致、多区域读写的能力&#xff0c;同时具备99.999%&#xff08;多区域部署&#xff09;的可用性&#xff0c;兼容PostgreSQL&#xff1b;同时发布的还有 DynamoDB 也提供类似的跨区域…

《孤岛惊魂4》无法启动提示缺少“msvcp100.dll”快速修复方法!

《孤岛惊魂4》缺少msvcp100.dll的解决之道 在探索《孤岛惊魂4》这款充满惊险与刺激的射击游戏时&#xff0c;玩家可能会遇到一些意外的障碍&#xff0c;其中之一便是“缺少msvcp100.dll”的错误提示。这个错误不仅让游戏无法正常启动&#xff0c;还可能让玩家对游戏的热情大打…

机器学习:监督学习、无监督学习

1. 引言 机器学习是一种人工智能领域的技术&#xff0c;它旨在让计算机通过学习数据和模式&#xff0c;而不是明确地进行编程来完成任务。 机器学习分为监督学习、无监督学习、半监督学习、强化学习 四种。 ​ 2. 监督学习 2.1 什么是监督学习 定义&#xff1a;根据已有的数…

反向代理-缓存篇

文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…

【leetcode100】反转链表

1、题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 2、初始思路 2.1 思路 # Definition for singly-linked list. # class ListNode: # …

1.网络知识-IP与子网掩码的关系及计算实例

IP与子网掩码 说实话&#xff0c;之前没有注意过&#xff0c;今天我打开自己的办公地电脑&#xff0c;看到我的网络配置如下&#xff1a; 我看到我的子网掩码是255.255.254.0&#xff0c;我就奇怪了&#xff0c;我经常见到的子网掩码都是255.255.255.0啊&#xff1f;难道公司配…

代发考试战报:12月8号通过HCIP-datacom数通两门考试

代发考试战报&#xff1a;12月8号通过HCIP-datacom数通两门考试&#xff0c;题库非常稳定&#xff0c;精修版题库&#xff0c;题库数量少&#xff0c;没有重复题&#xff0c;题库答案也很准确&#xff0c;排版也很清楚&#xff0c;看会就能考过&#xff0c;。#华为#HCIP#题库#考…

Autosar培训笔记整理<二>

目录 往期推荐 Autosar培训笔记整理&#xff1c;一&#xff1e; AUTOSAR 产品 AUTOSAR Classic Platform (CP): AUTOSAR Foundation: AUTOSAR Acceptance Tests (TC) AUTOSAR Methodology and Templates AUTOSAR Tools CP VS AP Autosar软件架构 Top view AUTOSAR基础…

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟&#xff0c;它集成了Maven和Docker&#xff0c;该插件的官方文档地址如下&#xff1a; 地址&#xff1a;https://github.com/spotify/dockerfile-maven 其他说明&#xff1a; dockerfile是用…

Maven(生命周期、POM、模块化、聚合、依赖管理)详解

Maven构建项目的生命周期 在Maven出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;软件开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试&#xff0c;部署等工作&#xff0c;这个过程就是项目构建的生命周期。虽然大家都在不停的做构建工作&…

MATLAB四种逻辑运算

MATLAB中的四种逻辑运算包括逻辑与用&或 a n d 表示 ( 全为 1 时才为 1 &#xff0c;否则为 0 ) and表示(全为1时才为1&#xff0c;否则为0) and表示(全为1时才为1&#xff0c;否则为0)&#xff0c;逻辑或用|或 o r 表示 ( 有 1 就为 1 &#xff0c;都为 0 才为 0 ) or表示…

【知识点】图与图论入门

何为图论 见名知意&#xff0c;图论 (Graph Theory) 就是研究 图 (Graph) 的数学理论和方法。图是一种抽象的数据结构&#xff0c;由 节点 (Node) 和 连接这些节点的 边 (Edge) 组成。图论在计算机科学、网络分析、物流、社会网络分析等领域有广泛的应用。 如下&#xff0c;这…

Ariba Procurement: Administration_Cloud Basics

# SAP Ariba Procurement: Administration_Cloud Basics 认识Ariba Cloud SAP Ariba Procurement 是一个云计算平台… The Ariba Cloud 平台需要简单理解的概念: Datacenter数据中心:SAP Ariba在世界各地有许多数据中心。这些数据中心构成了Ariba云的基本物理基础设施。 …

【TypeScript】Vue: Property finally does not exist on type Promise<void>.

【TypeScript】Vue: Property finally does not exist on type Promise&#xff1c;void&#xff1e;. 问题描述 Vue: Property finally does not exist on type Promise<void>. Do you need to change your target library? Try changing the lib compiler option to…

Navicat for MySQL 查主键、表字段类型、索引

针对Navicat 版本11 &#xff0c;不同版本查询方式可能不同 1、主键查询 &#xff08;重点找DDL&#xff01;&#xff01;&#xff01;&#xff09; 方法&#xff08;1&#xff09; &#xff1a;右键 - 对象信息 - 选择要查的表 - DDL - PRIMARY KEY 方法&#xff08;2&…

【SpringBug】lombok插件中@Data不能生成get和set方法

一&#xff1a;问题引入 可以看到我们在类UserInfo上写了Data注解&#xff0c;但是在测试文件中生成的反编译target文件Us二Info中没有get和set方法 二&#xff1a;解决方法 1&#xff1a;Spring升级问题&#xff08;解决了我的问题&#xff09; 原因是Spring官方进行了升级…

【Linux系统编程】:system V共享内存

前言&#xff08;System V简介&#xff09; System V是一种强大的进程管理系统&#xff0c;在UNIX和类UNIX操作系统中广泛应用。 它主要包含进程控制块&#xff08;PCB&#xff09;、进程表、信号集、文件描述符表等部分。其中&#xff0c;进程控制块是System V中的核心数据结…

[免费]SpringBoot+Vue疫苗接种预约管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue疫苗接种预约管理系统&#xff0c;分享下哈。 项目介绍 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在…