当前位置: 首页 > news >正文

数据结构——树和二叉树

目录

一、树的概念

 二、树结点之间的关系

三、二叉树

 1、满二叉树

2、完全二叉树

四、二叉树的存储

 1、顺序存储

2、链式存储

一、树的概念

        如果数据和数据之间满足一对多的关系,将其逻辑结构称之为树

        如下图:树的根与树的分支存在一对多的关系

b54e4257f7104888806cc26e65f1dcf5.jpeg

         将上图具体化,从根节点开始,每个节点都有一个或者多个分支,当然还有没有分支的情况

         6da1bbb1c5a94f73a8d5d6383acfeee5.png

  1. 如果数据和数据之间满足一对多的关系,将其逻辑结构称之为树。
    1. 逻辑关系:树形关系
    2. 存储关系:顺序存储 链式存储
  2. 每棵子树的根节点有且仅有一个直接前驱,但是可以有0个或者多个后继。
    1. 子树:一个结点及其下面的所有结点组成的树。

 二、树结点之间的关系

  1. 根节点:最上层的第一个结点,每棵树有且仅有一个根节点。根节点没有前驱
  2. 父结点:上一层与自己紧挨着的结点,称之为双亲结点。
  3. 子结点:下一层与自己紧挨着的结点。
  4. 兄弟结点:
  5. 堂兄弟结点:
  6. 叶子结点:没有子结点的结点

-------------------------------------

  1. 度:
    1. 结点的度:该结点的子结点个数。
    2. 树的度:该树中节点的最大的度
  2. 层数:
    1. 根结点的层数是1
    2. 结点的层数:父结点层数+1
  3. 深度:
    1. 从根结点出发,到最底层的层数

 举个例子:

6da1bbb1c5a94f73a8d5d6383acfeee5.png

    

上图当中:A称为根,BCD是A的子结点,称A是BCD的父结点,B,C,D之间是兄弟结点,E和G是堂兄弟结点,这个关系可以参考家庭之间的关系

        叶子结点(终端结点):比如E,F没有后继结点的结点称为叶子结点

        分支结点(非叶子结点):有后继结点,比如G结点

        A的度:3        B的度:2        D的度:4        上图树的度:4        上图树的层数:4

        A所在层数:1        C所在层数:2

         

 4.有序树与无序树

        1.如果将树中结点的各个子树看成是从左往右有次序的(即不能交换),则称该树为有序树,否则称为无序树

        森林:多个树组成的一个集合,树之间不存在关系,每棵树都独立存在

        如下图三个树的集合:

21542c475c3d4ffa8550d575a19891d0.png

三、二叉树

        二叉树是树的一种特殊形式,即每个分支最多只有两个子结点

        55c09fa69acd4803b253821ac58017c3.png 

 1、满二叉树

         每个结点的度都为2,即每个结点都有两个子节点,(即二叉树中每个结点的子结点都是满的)

edf5e215872843c1be3e1d835c4f1541.png

2、完全二叉树

        

在满二叉树的最底层,最右边,删除n个连续结点,形成的二叉树称之为完全二叉树。

完全二叉树的特点:

  1. 叶子结点只能出现在最下层和次下层
  2. 最下层的叶子结点集中在树的左边
  3. 倒数第2层的叶子结点,一定在右边连续位置
  4. 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

        几种常见的完全二叉树:

8178040ca33746a19d93f77dfaaa6b45.png

       

        完全二叉树的编号方式:按照顺序编号

b55cd3300cbc4b99a0bcad554f3adefb.png

四、二叉树的存储

 1、顺序存储

  1. 二叉树的顺序存储,就是使用一个一维数组存储二叉树结点中的数据,且结点的编号位置就是数组的下标索引。
  2. 只有在完全二叉树的情况下才能填满数组
  3. 当为不完全二叉树的时候,会造成大量的空间浪费。所以一般不使用顺序存储。

2、链式存储

  1. 先序,中序,后序创建。
  2. 由于是单向链表前者结点可以找到后者结点,但是后者结点不好找前者结点。
  3. 所以使用先序创建。
  4. 结点的表示:

    包含了数据域、指向左子树的指针和指向右子树的指针

    数据域:存放的数据

    指向左子树的指针:存放左子树的地址

    指向右子树的指针:存放右子树的地址cc1fd2edc29542d99d56b3fa7f29eaf9.png

使用链式存储方式实现二叉树的创建和遍历,创建如下图的二叉树

023ff6c0a31e4ead9919e83597d99bca.png

//二叉树的应用
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//创建根节点
struct tree_node
{char date;struct tree_node *left;//左树指针struct tree_node *right;//右树指针
};
//先序创建
//利用递归创建二叉树,返回类型为下一个结点的地址,实现递归创建
struct tree_node * tree_create()
{struct tree_node *node=NULL;//创建一个指针存放节点地址,初始化为空char str;//用来存储创建的数据scanf(" %c",&str);//从终端获取要创建的二叉树if(str=='#')//如果接受到字符#,即这个结点没有return NULL;node=(struct tree_node*)malloc(sizeof(struct tree_node));//新创建的结点if(node==NULL){printf("结点创建失败\n");return NULL;}node->date=str;//递归创建左子树node->left=tree_create();//递归创建右子树node->right=tree_create();return node;
}
//先序遍历
bool tree_erg_fir(struct tree_node *root)
{if(root==NULL){return false;}printf("%c",root->date);tree_erg_fir(root->left);tree_erg_fir(root->right);
}
//中序遍历
bool tree_erg_middle(struct tree_node *root)
{if(root==NULL){return false;}tree_erg_middle(root->left);printf("%c",root->date);tree_erg_middle(root->right);
}
//后序遍历
bool tree_erg_behind(struct tree_node *root)
{if(root==NULL){return false;}tree_erg_behind(root->left);tree_erg_behind(root->right);printf("%c",root->date);
}
int main(int argc, const char *argv[])
{printf("请输入二叉树,创建方式为先序创建:\n");struct tree_node *root=tree_create();//先序遍历tree_erg_fir(root);printf("\n");//中序遍历tree_erg_middle(root);printf("\n");//后序遍历tree_erg_behind(root);printf("\n");return 0;
}

输出如下;

请输入二叉树,创建方式为先序创建:
ABDE###F##CM###
ABDEFCM
EDBFAMC
EDFBMCA

相关文章:

数据结构——树和二叉树

目录 一、树的概念 二、树结点之间的关系 三、二叉树 1、满二叉树 2、完全二叉树 四、二叉树的存储 1、顺序存储 2、链式存储 一、树的概念 如果数据和数据之间满足一对多的关系&#xff0c;将其逻辑结构称之为树 如下图&#xff1a;树的根与树的分支存在一对多的关系 将上…...

142. Go操作Kafka(confluent-kafka-go库)

文章目录 Apache kafka简介开始使用Apache Kafka构建生产者构建消费者 总结 之前已经有两篇文章介绍过 Go如何操作 kafka 28.windows安装kafka&#xff0c;Go操作kafka示例&#xff08;sarama库&#xff09; 51.Go操作kafka示例&#xff08;kafka-go库&#xff09; Apache ka…...

spring boot(学习笔记第十九课)

spring boot(学习笔记第十九课) Spring boot的batch框架&#xff0c;以及Swagger3(OpenAPI)整合 学习内容&#xff1a; Spring boot的batch框架Spring boot的Swagger3&#xff08;OpenAPI&#xff09;整合 1. Spring boot batch框架 Spring Batch是什么 Spring Batch 是一个…...

docker安装 redis 并且加密开启SSL/TLS通道

拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest docker tag registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest redis:latest要在 Docker 容器中启动 Redis 并开启 SSL/TLS 加密&#xff0c;需按照以下步骤修改启动命令和配置…...

什么是ARM架构?什么是X86架构?两者的区别是什么?

一、什么是ARM架构 &#xff08;一&#xff09;起源于发展 ARM 架构由英国剑桥的 Acorn 计算机公司开发。因市场无合适产品&#xff0c;Acorn 自行设计出第一款微处理器&#xff0c;命名为 ARM。此后 ARM 架构不断发展&#xff0c;1990 年为与苹果合作成立 ARM 公司&#xff0…...

【vscode】vscode paste image插件设置

本文首发于 ❄️慕雪的寒舍 vscode编辑md文件的时候&#xff0c;如果想插入图片&#xff0c;自带的粘贴只会粘贴到当前目录下&#xff0c;也没有文件重命名&#xff0c;很不友好。 在扩展商店里面有mushan的Paste Image插件&#xff0c;相比自带的&#xff0c;更加友好一点。但…...

自定义string类

#include <iostream> #include <string> int main() { std::string str "Hello, World!"; // 使用 c_str() 将 std::string 转换为 C 风格字符串&#xff0c;并传递给 printf printf("The string is: %s\n", str.c_str()); // 尝试修改…...

Python | Leetcode Python题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; class Solution:def firstUniqChar(self, s: str) -> int:position dict()q collections.deque()n len(s)for i, ch in enumerate(s):if ch not in position:position[ch] iq.append((s[i], i))else:position[ch] -1while q and po…...

RocketMQ 消费时序列化报错问题分析及解决

问题背景 在2024年3月7日&#xff0c;系统消费 RocketMQ 消息时出现了序列化报错&#xff0c;错误信息显示为&#xff1a; java.io.InvalidClassException: com.xxx.xxx.bean.mg.GoodsChangeLogMessage; local class incompatible: stream classdesc serialVersionUID... 这是…...

全能与专精:探索未来AI模型的发展趋势与市场潜力

文章目录 每日一句正能量前言AI模型的全面评估和比较AI模型的专精化和可扩展性AI模型的合理使用和道德规范后记 每日一句正能量 一个人&#xff0c;如果没有经受过投资失败的痛楚&#xff0c;又怎么会看到绝望之后的海阔天空。很多时候&#xff0c;经历了人生中最艰难的事&…...

Python深度学习:【开源数据集系列】ImageNet数据集

ImageNet 是一个大规模的视觉数据集,是计算机视觉领域最重要的基准数据集之一。该数据集由普林斯顿大学和斯坦福大学的研究人员发起,于 2009 年推出。ImageNet 是用于物体分类、目标检测、图像分割、姿势估计等多种任务的通用数据集,尤其在深度学习和计算机视觉的突破性研究…...

微信小程序手写签名

微信小程序手写签名组件 该组件基于signature_pad封装&#xff0c;signature_pad本身是web端的插件&#xff0c;此处将插件代码修改为小程序端可用。 signature_pad.js /*!* Signature Pad v5.0.3 | https://github.com/szimek/signature_pad* (c) 2024 Szymon Nowak | Releas…...

Javascript 使用中点查找矩形的角(Find Corners of Rectangle using mid points)

考虑一个矩形 ABCD&#xff0c;我们给出了边 AD 和 BC 中点&#xff08;分别为 p 和 q&#xff09;的坐标以及它们的长度 L&#xff08;AD BC L&#xff09;。现在给定参数&#xff0c;我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子&#xff1a; 输入&#xff1a;p (1,…...

【困难】 猿人学web第一届 第18题 jsvmp 洞察先机

文章目录 数据接口分析还原加密参数插桩调试分析日志插桩补充 python 代码 数据接口分析 数据接口 https://match.yuanrenxue.cn/match/18data 请求参数 {page: 页码, t: 时间戳, v: 加密值} 请求第一页不需要携带 t, v 参数 cookie 只需要携带 sessionid 只要 还原加密字段…...

IDEA Maven 源修改为国内阿里云镜像的正确方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…...

OpenCV 旋转矩形边界

边界矩形是用最小面积绘制的&#xff0c;所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。 import cv2 import numpy as npimgcv2.imread(rD:\PythonProject\thunder.jpg) img1cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) print(img.dtype) ret,threshcv2.threshold(img1,1…...

人车防撞系统安全生产方案

根据《市场监管总局关于2021~2023年全国特种设备安全状况的通告》数据显示&#xff1a;2023年&#xff1a;全国共发生特种设备事故和相关事故71起&#xff0c;其中死亡69人。包含叉车在内的场(厂)内专用机动车辆事故29起、死亡28人&#xff0c;占事故总数的40.85%、死亡人数的4…...

开放式耳机哪个牌子好?长文传授6招秘籍,彻底远离坑货!

​大家好&#xff0c;作为一位专注于评测各类数码产品的博主&#xff0c;今天我特别推荐开放式耳机作为我们日常的首选。这种耳机以其独特的设计&#xff0c;避免了传统耳机长时间佩戴可能带来的不适和感染风险。开放式耳机佩戴简便且稳固&#xff0c;尤其适合热爱跑步和运动的…...

vue2和vue3双向绑定的原理

Vue.js 的双向绑定是 Vue 框架的核心特性之一&#xff0c;它允许数据和视图之间保持同步。虽然 Vue 2 和 Vue 3 都实现了双向绑定&#xff0c;但它们在实现细节上有所不同。 Vue 2 双向绑定的原理 在 Vue 2 中&#xff0c;双向绑定主要依赖于 Object.defineProperty 和观察者…...

别为大文件烦恼!mp4文件太大怎么变小?3个管用方法

你是否曾经遇到过mp4视频文件过大的困扰&#xff1f;每当想要分享或存储mp4文件时&#xff0c;巨大的文件就成了阻碍。明明感觉感觉没占用多少空间&#xff0c;但是设备却常常出现空间过满警告。 没多少空间的设备真是让人大为恼火&#xff0c;没人想多花一份钱买设备。那么只…...

【清华代码熊】图解 Gemma 4 架构设计细节

&#x1f4cc; 本期图解 Google 开源Gemma 4 架构设计细节&#xff0c;其中端侧模型的架构上有很多值得一看的设计。...

8250串行通信避坑指南:如何用内环测试快速定位硬件故障(附Proteus仿真文件)

8250串行通信避坑指南&#xff1a;如何用内环测试快速定位硬件故障 在嵌入式系统开发中&#xff0c;串行通信故障排查往往是最令人头疼的问题之一。当你面对一个无法正常通信的系统时&#xff0c;问题可能出在硬件连接、芯片配置、软件逻辑或者中断处理等任何一个环节。而8250这…...

SPI扩展CAN方案:从寄存器配置到多路通信实战

1. SPI扩展CAN方案的核心价值 在工业控制领域&#xff0c;CAN总线因其高可靠性和实时性被广泛使用。但随着设备节点增加&#xff0c;主控芯片原生CAN接口往往不够用。这时通过SPI接口扩展CAN通道就成了性价比极高的解决方案。我曾在多个工业现场实测&#xff0c;用10元级的MCP2…...

全志科技Linux驱动开发面试经验与Cache一致性解析

1. 全志科技Linux驱动开发工程师面试全解析作为一名在嵌入式Linux领域摸爬滚打多年的老司机&#xff0c;最近刚经历了全志科技的社招面试。这家国产芯片大厂的面试风格相当有特色&#xff0c;特别是对Cache一致性和驱动开发细节的考察&#xff0c;堪称"灵魂拷问"级别…...

2026年高性价比降AI工具:SpeedAI降AIGC率稳过审

2026年AIGC工具已经全面融入各类内容创作场景&#xff0c;降AI率、降AIGC率不再是学术圈的小众需求&#xff0c;更是论文写作、商业文案产出、自媒体内容创作、正式文稿发表等场景的核心刚需。现在市面上降AI工具种类繁多&#xff0c;但真正能做到效果稳定、不改动核心内容、操…...

从经验到智能:TVA时代企业质检员的角色转型

随着工业4.0的推进&#xff0c;汽车零部件生产逐渐向智能化、自动化转型&#xff0c;智能体视觉检测系统&#xff08;TVA&#xff09;的广泛应用&#xff0c;彻底改变了传统焊接点检测的模式&#xff0c;也对质检员的角色与能力提出了新的要求。传统模式下&#xff0c;质检员的…...

1篇1章3节:AIGC的发展历程,迈向生成创造世界的关键突破

随着人工智能技术的快速发展&#xff0c;生成式人工智能已成为信息社会的重要推动力。从最初的基于规则的文本生成到如今能够创造高度逼真的图像、视频和交互式内容&#xff0c;AIGC的发展经历了多个关键阶段。本文将回顾AIGC的发展历程&#xff0c;并探讨其迈向生成创造世界阶…...

Spring 事务从入门到精通:一篇搞定事务失效、传播行为、回滚规则(Spring系列10)

一、前言 在日常开发中&#xff0c;事务是保证数据一致性的核心手段。尤其是转账这类业务&#xff0c;必须保证「A减钱」和「B加钱」两个操作同成功、同失败&#xff0c;否则就会出现资金异常。 Spring 提供了一套完整的声明式事务解决方案&#xff0c;基于 AOP 实现&#xff0…...

别只盯着去噪!拆解DnCNN中的BatchNorm:为什么它能让残差学习在PyTorch里又快又稳?

别只盯着去噪&#xff01;拆解DnCNN中的BatchNorm&#xff1a;为什么它能让残差学习在PyTorch里又快又稳&#xff1f; 当我们在PyTorch中实现DnCNN时&#xff0c;往往会把注意力集中在残差学习的巧妙设计上&#xff0c;却忽略了BatchNorm&#xff08;BN&#xff09;这个看似普通…...

大模型之Linux服务器部署大模型菊

一、各自优势和对比 这是检索出来的数据&#xff0c;据说是根据第三方评测与企业数据&#xff0c;三款产品在代码生成质量上各有侧重&#xff1a; 产品 语言优势 场景亮点 核心差异 百度 Comate C核心代码质量第一&#xff1b;Python首生成率达92.3% SQL生成准确率提升35%&…...