数据结构——树和二叉树
目录
一、树的概念
二、树结点之间的关系
三、二叉树
1、满二叉树
2、完全二叉树
四、二叉树的存储
1、顺序存储
2、链式存储
一、树的概念
如果数据和数据之间满足一对多的关系,将其逻辑结构称之为树
如下图:树的根与树的分支存在一对多的关系
将上图具体化,从根节点开始,每个节点都有一个或者多个分支,当然还有没有分支的情况
- 如果数据和数据之间满足一对多的关系,将其逻辑结构称之为树。
- 逻辑关系:树形关系
- 存储关系:顺序存储 链式存储
- 每棵子树的根节点有且仅有一个直接前驱,但是可以有0个或者多个后继。
- 子树:一个结点及其下面的所有结点组成的树。
二、树结点之间的关系
- 根节点:最上层的第一个结点,每棵树有且仅有一个根节点。根节点没有前驱
- 父结点:上一层与自己紧挨着的结点,称之为双亲结点。
- 子结点:下一层与自己紧挨着的结点。
- 兄弟结点:
- 堂兄弟结点:
- 叶子结点:没有子结点的结点
-------------------------------------
- 度:
- 结点的度:该结点的子结点个数。
- 树的度:该树中节点的最大的度
- 层数:
- 根结点的层数是1
- 结点的层数:父结点层数+1
- 深度:
- 从根结点出发,到最底层的层数
举个例子:
上图当中: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.如果将树中结点的各个子树看成是从左往右有次序的(即不能交换),则称该树为有序树,否则称为无序树
森林:多个树组成的一个集合,树之间不存在关系,每棵树都独立存在
如下图三个树的集合:
三、二叉树
二叉树是树的一种特殊形式,即每个分支最多只有两个子结点
1、满二叉树
每个结点的度都为2,即每个结点都有两个子节点,(即二叉树中每个结点的子结点都是满的)
2、完全二叉树
在满二叉树的最底层,最右边,删除n个连续结点,形成的二叉树称之为完全二叉树。
完全二叉树的特点:
- 叶子结点只能出现在最下层和次下层
- 最下层的叶子结点集中在树的左边
- 倒数第2层的叶子结点,一定在右边连续位置
- 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
几种常见的完全二叉树:
完全二叉树的编号方式:按照顺序编号
四、二叉树的存储
1、顺序存储
- 二叉树的顺序存储,就是使用一个一维数组存储二叉树结点中的数据,且结点的编号位置就是数组的下标索引。
- 只有在完全二叉树的情况下才能填满数组
- 当为不完全二叉树的时候,会造成大量的空间浪费。所以一般不使用顺序存储。
2、链式存储
- 先序,中序,后序创建。
- 由于是单向链表前者结点可以找到后者结点,但是后者结点不好找前者结点。
- 所以使用先序创建。
结点的表示:
包含了数据域、指向左子树的指针和指向右子树的指针
数据域:存放的数据
指向左子树的指针:存放左子树的地址
指向右子树的指针:存放右子树的地址
使用链式存储方式实现二叉树的创建和遍历,创建如下图的二叉树
//二叉树的应用
#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、链式存储 一、树的概念 如果数据和数据之间满足一对多的关系,将其逻辑结构称之为树 如下图:树的根与树的分支存在一对多的关系 将上…...

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

spring boot(学习笔记第十九课)
spring boot(学习笔记第十九课) Spring boot的batch框架,以及Swagger3(OpenAPI)整合 学习内容: Spring boot的batch框架Spring boot的Swagger3(OpenAPI)整合 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 加密,需按照以下步骤修改启动命令和配置…...

什么是ARM架构?什么是X86架构?两者的区别是什么?
一、什么是ARM架构 (一)起源于发展 ARM 架构由英国剑桥的 Acorn 计算机公司开发。因市场无合适产品,Acorn 自行设计出第一款微处理器,命名为 ARM。此后 ARM 架构不断发展,1990 年为与苹果合作成立 ARM 公司࿰…...

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

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

Python | Leetcode Python题解之第387题字符串中的第一个唯一字符
题目: 题解: 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日,系统消费 RocketMQ 消息时出现了序列化报错,错误信息显示为: java.io.InvalidClassException: com.xxx.xxx.bean.mg.GoodsChangeLogMessage; local class incompatible: stream classdesc serialVersionUID... 这是…...

全能与专精:探索未来AI模型的发展趋势与市场潜力
文章目录 每日一句正能量前言AI模型的全面评估和比较AI模型的专精化和可扩展性AI模型的合理使用和道德规范后记 每日一句正能量 一个人,如果没有经受过投资失败的痛楚,又怎么会看到绝望之后的海阔天空。很多时候,经历了人生中最艰难的事&…...
Python深度学习:【开源数据集系列】ImageNet数据集
ImageNet 是一个大规模的视觉数据集,是计算机视觉领域最重要的基准数据集之一。该数据集由普林斯顿大学和斯坦福大学的研究人员发起,于 2009 年推出。ImageNet 是用于物体分类、目标检测、图像分割、姿势估计等多种任务的通用数据集,尤其在深度学习和计算机视觉的突破性研究…...

微信小程序手写签名
微信小程序手写签名组件 该组件基于signature_pad封装,signature_pad本身是web端的插件,此处将插件代码修改为小程序端可用。 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,我们给出了边 AD 和 BC 中点(分别为 p 和 q)的坐标以及它们的长度 L(AD BC L)。现在给定参数,我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子: 输入:p (1,…...

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

IDEA Maven 源修改为国内阿里云镜像的正确方式
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

OpenCV 旋转矩形边界
边界矩形是用最小面积绘制的,所以它也考虑了旋转。使用的函数是**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年全国特种设备安全状况的通告》数据显示:2023年:全国共发生特种设备事故和相关事故71起,其中死亡69人。包含叉车在内的场(厂)内专用机动车辆事故29起、死亡28人,占事故总数的40.85%、死亡人数的4…...

开放式耳机哪个牌子好?长文传授6招秘籍,彻底远离坑货!
大家好,作为一位专注于评测各类数码产品的博主,今天我特别推荐开放式耳机作为我们日常的首选。这种耳机以其独特的设计,避免了传统耳机长时间佩戴可能带来的不适和感染风险。开放式耳机佩戴简便且稳固,尤其适合热爱跑步和运动的…...
vue2和vue3双向绑定的原理
Vue.js 的双向绑定是 Vue 框架的核心特性之一,它允许数据和视图之间保持同步。虽然 Vue 2 和 Vue 3 都实现了双向绑定,但它们在实现细节上有所不同。 Vue 2 双向绑定的原理 在 Vue 2 中,双向绑定主要依赖于 Object.defineProperty 和观察者…...

别为大文件烦恼!mp4文件太大怎么变小?3个管用方法
你是否曾经遇到过mp4视频文件过大的困扰?每当想要分享或存储mp4文件时,巨大的文件就成了阻碍。明明感觉感觉没占用多少空间,但是设备却常常出现空间过满警告。 没多少空间的设备真是让人大为恼火,没人想多花一份钱买设备。那么只…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...