第3章 数据结构中树的概念

news2024/12/23 6:40:42

文章目录

    • 文档配套视频讲解链接地址
    • 第03章 树
      • 3.1 二叉树创建
        • 1. 实例20 二叉树创建
      • 3.2 二叉树遍历
        • 1. 二叉树的遍历
        • 2. 三种遍历算法
        • 3. 实例21 二叉树的遍历

文档配套视频讲解链接地址

  1. 腾讯课堂视频链接地址 : 24_树与二叉树_树的理解
  2. 腾讯课堂视频链接地址 : 25_树与二叉树_二叉树遍历

第03章 树

3.1 二叉树创建

1. 实例20 二叉树创建

  • 源文件
04-ds/20-bitree.c
  • 源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node
{
    int data; 
    struct node * lchild; // left child 左孩子指针
    struct node * rchild; // right child 右孩子指针
}bitree_t;


// i :根的起始编号, n :要创建节点的个
// 根节点从1 开始 
// n 表示的一共的节点个数  
bitree_t * create_bitree(int i , int n)
{
    bitree_t * r = malloc(sizeof(bitree_t)); 
    r->data = i;    // 创建根节点
    printf("i=%d\n",i);  
    if(2*i <= n) // 有左孩子 
    {
        r->lchild =  create_bitree(2*i,n); 
    }
    else 
    {
        r->lchild = NULL; // 左孩子为空
    }

    if(2*i+1 <=n) // 有右孩子 
    {
        r->rchild =  create_bitree(2*i+1,n); 
    }
    else
    {
        r->rchild = NULL; 
    }

    return r; 
}



int main(int argc, char const *argv[])
{
    bitree_t *R = create_bitree(1,15); 

    return 0;
}


  • 运行结果
i=1
i=2
i=4
i=8
i=9
i=5
i=10
i=11
i=3
i=6
i=12
i=13
i=7
i=14
i=15

3.2 二叉树遍历

1. 二叉树的遍历

  • 遍历 :沿某条搜索路径周游二叉树,对树中的每一个节点访问一次且仅访问一次。

  • “遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径进行遍历的问题。

2. 三种遍历算法

  • 由于二叉树的递归性质,遍历算法也是递归的。三种基本的遍历算法如下 :

  • 先序序列:访问顺序,根左右 ,先访问树根,再访问左子树,最后访问右子树;

  • 中序序列:访问顺序,左根右: 先访问左子树,再访问树根,最后访问右子树;

  • 后序序列:访问顺序,左右根,先访问左子树,再访问右子树,最后访问树根;

  • 例如,

image-20221005145846872

先序访问:先访问根, 再访问左, 最后访问右

A B C D E F G H K 

中序访问: 先访问左, 再访问根, 最后访问右

B D C A E H G K F 

后序访问: 先访问左, 再访问右 , 最后访问根

D C B H K G F E A

3. 实例21 二叉树的遍历

  • 在实例20 的基础上实现遍历

image-20221005151804129

  • 先序顺序: 根左右
1 2 4  8 9 5 10 11 3 6 12 13 7 14 15 
  • 中序顺序: 左根右
8 4 9 2 10 5 11 1 12 6 13 3 14 7 15
  • 后序顺序: 左右跟
8 9 4 10 11 5 2 12 13 6 14 15 7 3 1 
  • 源文件
04-ds/21-bitree.c
  • 源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node
{
    int data;
    struct node *lchild; // left child 左孩子指针
    struct node *rchild; // right child 右孩子指针
} bitree_t;

// i :根的起始编号, n :要创建节点的个
// 根节点从1 开始
// n 表示的一共的节点个数
bitree_t *create_bitree(int i, int n)
{
    bitree_t *r = malloc(sizeof(bitree_t));
    r->data = i; // 创建根节点
    printf("i=%d\n", i);
    if (2 * i <= n) // 有左孩子
    {
        r->lchild = create_bitree(2 * i, n);
    }
    else
    {
        r->lchild = NULL; // 左孩子为空
    }

    if (2 * i + 1 <= n) // 有右孩子
    {
        r->rchild = create_bitree(2 * i + 1, n);
    }
    else
    {
        r->rchild = NULL;
    }

    return r;
}

// 递归函数一定要有结束条件
// 根左右
int preorder(bitree_t *b)
{
    // 结束条件 空树返回
    if (b == NULL)
        return 0;

    // 先访问根
    printf("%d ", b->data);

    // 再访问左
    preorder(b->lchild);

    // 最后访问右
    preorder(b->rchild);
    return 0;
}

// 中序访问
// 左根右
int inorder(bitree_t *b)
{
    // 结束条件 空树返回
    if (b == NULL)
        return 0;

    // 访问左
    inorder(b->lchild);

    // 访问根
    printf("%d ", b->data);

    // 访问右
    inorder(b->rchild);
    return 0;
}

// 后序访问
// 左右根
int postorder(bitree_t *b)
{
    // 结束条件 空树返回
    if (b == NULL)
        return 0;

    // 访问左
    postorder(b->lchild);

    // 访问右
    postorder(b->rchild);

    // 访问根
    printf("%d ", b->data);
    return 0;
}

int main(int argc, char const *argv[])
{
    bitree_t *R = create_bitree(1, 15);
    printf("先序顺序:");
    preorder(R);
    printf("\n");

    printf("中序顺序:");
    inorder(R);
    printf("\n");

    printf("后序顺序:");
    postorder(R);
    printf("\n");
    return 0;
}

  • 运行结果
先序顺序:1 2 4 8 9 5 10 11 3 6 12 13 7 14 15 
中序顺序:8 4 9 2 10 5 11 1 12 6 13 3 14 7 15 
后序顺序:8 9 4 10 11 5 2 12 13 6 14 15 7 3 1 

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

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

相关文章

论文精读:End-to-End Semi-Supervised Object Detection with Soft Teacher

https://arxiv.org/pdf/2106.09018.pdf 半监督学习重在流程&#xff0c;而不在网络细节 Abstract 本文提出了一种端到端半监督目标检测方法&#xff0c;不同于以往更复杂的多阶段方法。端到端训练逐渐提高了训练过程的伪标签质量&#xff0c;越来越准确的伪标签进而有利于目…

法大大携手企企科技,助力企业实现全生命周期合同管理

伴随着企业信息化高速发展&#xff0c;打破信息孤岛实现全业务信息化的需求日益凸显&#xff0c;企企科技携手法大大&#xff0c;完善了客户从签署到项目管理全场景的信息化解决方案&#xff0c;全面助力客户实现项目管控信息化。“数字化技术对项目管理具有多角度、全方位的影…

6-JS的Fetch 跨域问题

跨域访问 只要协议、主机、端口之一不同&#xff0c;就不同源&#xff0c;例如 http://localhost:7070/a 和 https://localhost:7070/b 就不同源 同源检查是浏览器的行为&#xff0c;而且只针对 fetch、xhr 请求 如果是其它客户端&#xff0c;例如 java http client&#xff…

oracle开启归档日志并修改归档日志路径

一、归档日志概念 归档日志&#xff1a;非活动的重做日志&#xff0c;用来保存所有的重做历史记录。 什么时候写归档日志&#xff1a;当数据库处于archivelog模式并重做日志切换的时候&#xff0c;后台进程ARCH会启动将重做日志的内容完整的保存到归档日志中。 日志操作模式…

ZPM介绍(2)

发布您自己的软件 首先&#xff1a;要发布您的软件&#xff0c;您要支持这个”命名规范。其中和zmp最相关的是包名和l类名的设计&#xff0c;你要定义成这样&#xff1a; company.project.subpackage.TheClass.cls 如果您的Package Name定义是&#xff1a; Company.Project, 有…

元数据管理-解决方案调研二:元数据管理解决方案——Saas/内部解决方案(3)

Saas/内部解决方案 2.10、Netflix Metacat Metacat 是一种元数据服务&#xff0c;使数据易于发现、处理和管理。在 Netflix&#xff0c;数据仓库由存储在 Amazon S3&#xff08;通过 Hive&#xff09;、Druid、Elasticsearch、Redshift、Snowflake 和 MySql 中的大量数据集组…

【Linux入门指北】文件服务器

文件服务器 文章目录文件服务器一、FTP Server1.简介2.FTP Server 默认配置3.FTP Clinet4.vsftpd的主动和被动模式二、NFS Server1.简要介绍2.环境配置3.关闭防火墙4.nfs(存储端)5.web1 web2 web3 客户端5.1 安装NFS客户端5.2 开启httpd服务5.3 查看存储端共享5.4 手动挂载5.5 …

电容笔哪个牌子好?2022年电容笔十大品牌排行榜

当电容笔搭配上了ipad&#xff0c;可以大大提升我们的工作效率&#xff0c;不会变得乏味。对于那些对绘画要求很高的人来说&#xff0c;电容笔在绘画中的作用更是不容忽视的。其实我个人对电容笔这块了解还不少的&#xff0c;有着许多平替电容笔都支持在ipad上使用的&#xff0…

社会工程攻击依然是企业面临的最大威胁

企业进入数字化时代&#xff0c;网络攻击行为无处不在&#xff0c;利用社会工程攻击已成黑客的惯用手段。研究表明&#xff0c;91%的网络攻击是通过社会工程手段完成的。 常见的社会工程攻击手段有哪些&#xff1f; 网络钓鱼&#xff1a; 这是经典手段&#xff0c;大多数的钓…

HTML5期末大作业:基于html企业官网项目的设计与实现【艺术官网】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Alien Skin Exposure2023调色滤镜插件RAW后期处理软件

Exposure既可以作为ps、lr的插件使用&#xff0c;也可以单独作为一款专业的图像编辑器使用&#xff0c;它可以处理RAW格式的照片&#xff0c;拥有500多种预设滤镜&#xff0c;还有照片管理和添加文字水印等功能。可以说&#xff0c;无论是新手还是设计师和摄影师&#xff0c;都…

【POJ No. 2431】 丛林探险 Expedition

【POJ No. 2431】 丛林探险 Expedition 北大OJ 题目地址 【题意】 一群人开着一辆卡车冒险进入丛林深处&#xff0c;卡车油箱坏了&#xff0c;每走1米就会漏1升油&#xff0c;他们需要到最近的城镇&#xff08;距离不超过106米&#xff09;修理卡车。卡车当前位置和城镇之间有…

怎么将视频转化为gif?

如何将视频转化为gif&#xff1f;gif是一种大家平时常见的动态图片格式&#xff0c;动图是一种非常有意思的图片种类&#xff0c;gif一般都是一些非常有意思的小动图&#xff0c;例如我们在群聊时使用的动态表情包&#xff0c;还有一些球迷朋友喜欢看的足球进球动图等。gif动图…

asp核酸检测预登记系统源码

用asp开发的核酸检测预登记系统上线了&#xff0c;用户填写姓名&#xff0c;手机&#xff0c;身份证号&#xff0c;地址等信息后生成一个加密的二维码&#xff0c;管理员扫码后可以得到真实的二维码文字信息。主要为方便核酸采集统计托底等&#xff0c;也可以用作会议入场信息采…

【NLP】使用 PyTorch 通过 Hugging Face 使用 BERT 和 Transformers 进行情感分析

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

初识Kafka构造组成

在刚学习kafka的时候&#xff0c;有时候会比较纳闷broker是什么&#xff1f;topic又是什么&#xff1f;一台机器上有多少broker&#xff1f;又有多少的topic和partition&#xff1f;由下面这张图来初识我们的kafka&#xff1a; 上图中包含了一个kafka集群的所有组件&#xff1a…

大数据毕业设计题目推荐 毕设选题大全

文章目录0 前言1 如何选题1.1 选题技巧&#xff1a;如何避坑(重中之重)1.2 为什么这么说呢&#xff1f;1.3 难度把控1.4 题目名称1.5 最后2 大数据 - 选题推荐2.1 大数据挖掘类2.2 大数据处理、云计算、区块链 毕设选题2.3 大数据安全类2.4 python大数据 游戏设计、动画设计类2…

LeetCode-808. 分汤【动态规划,概论与统计,记忆化搜索】

LeetCode-808. 分汤【动态规划&#xff0c;概论与统计&#xff0c;记忆化搜索】 题目描述&#xff1a;解题思路一&#xff1a;动态规划&#xff0c;这里将所有的汤除了25&#xff0c;缩小数值。自底向上解题思路二&#xff1a;记忆化搜索&#xff0c;自顶向下搜索&#xff0c;会…

R summarize()分组摘要

summarize()分组摘要分组平均值最大最小值计数 library(nycflights13) library(tidyverse)summarize()可以将数据折叠成一行 如果不与group_by()一起使用&#xff0c;那么summarize()也没什么用 summarize(flights, delay mean(dep_delay, na.rm TRUE))delay12.63907 group…

基于PHP+MySQL仓库管理系统的设计与实现

PHP&#xff1a;MySQL仓库管理系统的设计与实现是一个集合了中小型超市所有特点的一个管理系统, 它使用当下最流行的PHP语言来进行开发,实现了管理员登录,员工登录,超市内物资基本信息管理,进货信息管理,销售信息管理,超市内员工信息管理,查询统计等功能, 通过这些功能可以让超…