树的基本概念

树(Tree)

请添加图片描述
"树"这种数据很像现实生活中的“树”, 这里的每个元素我们叫做“节点”

用来连线相邻节点之间的关系,我们叫做“父子关系”
请添加图片描述

  • A节点就是B节点的父节点,B节点是A节点的‘子节点’
  • B,C,D这三个节点的父节点是同一个节点,所以它们是兄弟节点
  • 把没有父节点的节点叫做根节点,也图中的E
  • 把没有子节点的节点叫做叶子节点或者叶节点,比如图中的G,H, I, J, K, L

高度(Height),深度(Depth),层(Level)

概述

节点的高度:节点到叶子节点的最长路径(边数)

节点的深度:根节点到这个节点所经历的边的个数
- 节点的层数:节点的深度 + 1
- 树的高度: 根节点的高度
请添加图片描述

高度
- 其实就是从下往上度量,比如我们要度量第10层楼的高度,第13层楼的高度,起点都是地面
- 所以,树这种数据结构的高度也是一样,从最底层开始计数,并且计数的起点都是0

深度
- 从上往下度量。比如水中与的深度,是从水平面开始度量
- 所有,树这种数据结构的深度也是类似的,从根节点开始度量,并且计数起点也是0

层数
- 与深度类似,不过,计数起点是1,也就是根节点的位于第1层

二叉树(Binary Tree)

概述

每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点

请添加图片描述

满二叉树

图中编号2的二叉树。叶子节点全都在最底层

除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树叫做满二叉树

完全二叉树

编号3的二叉树,叶子节点都在最底下两层,最后一层的叶子节点都靠左

并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫做完全二叉树

二叉树存储方式

链表存储法

请添加图片描述
每个节点都有三个字段,其中一个存储数据,另外两个是指向左右子节点指针

我们只要拎住根节点,就可以通过左右子节点的指针,把整棵树都串起来
大部分二叉树代码都是通过这种结构实现的

顺序存储法

请添加图片描述

把根节点存储在下标i = 1的位置,那左子节点存储在下标 2 * i = 2 的位置,右子节点存储在 2 * i + 1 = 3 的位置

以此类推,B节点的左子节点存储在 2 * i = 2 * 2 = 4的位置,右子节点存储在 2 * i + 1 = 2 * 2 + 1 = 5的位置

为什么偏偏把最后一层的叶子节点靠左排列的叫做完全二叉树?

  • 从上图看出,一颗完全二叉树,仅仅“浪费”了一个下标为0的存储位置,如果非完全二叉树,则会浪费比较多的数组存储空间

请添加图片描述

二叉树遍历

前序遍历

对于树中任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的左子树

中序遍历

对于树中任意节点来说,先打印它的左子树,然后再打印它本省,最后打印它的右子树

后序遍历

对于树中任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身

请添加图片描述

时间复杂度

从上图可以看出,每个节点最多会被访问两次,所以遍历操作的时间复杂度,跟节点的个数n成正比,也就是时间复杂度: O(n)

代码展示

请添加图片描述

参考资料

  • 卡特兰数 — 计数的映射方法的伟大胜利

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基础语法Ⅰ【注释、关键字、字面量、变量】

Java基础语法① 注释关键字与标识符数据类型字面量和常量变量转义字符 注释 注释是在写代码时,对代码作出的一些解释说明,比如某一个函数的作用(功能)、函数接收的参数以及函数返回什么东西等等。 这些解释说明没有任何功能&…

C# Winform DPI自适应方案

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形。 1.设置窗体和自定义用户控件的AutoScaleMode为None 实现目标:禁止窗体因为字体大小缩放变形 因为显示的高分屏,然后操作系统的设置了字体缩放引起的。窗体默认的AutoScaleMode = Font,控件会因为高分屏自动缩放…

遇到的状态308问题

前端用的vue.config.js做的代理,请求后端的地址https://n6118lr7-10010.usw3.devtunnels.ms 在请求的时候会308 是因为本地是http而请求地址是https 前端代理允许https接口代理即可

python pandas处理股票量化数据:笔记2

有一个同学用我的推荐链接注册了tushare社区帐号https://tushare.pro/register?reg671815,现在有了170分积分。目前使用数据的频率受限制。不过可以在调试期间通过python控制台获取数据,将数据保存在本地以后使用不用高频率访问tushare数据接口&#xf…

【Spring】Spring事务相关源码分析

目录: 1.讲述事务的一些基础概念。 2.讲述事务的生命周期源码 3.配置事务,以及事务注解的源码 1.前言 具体事务中Spring是怎么管理事务,怎么去管理、创建、销毁等操作的呢?这一次来分解一下。 2.事务概述(复习&a…

Vscode中使用make命令

前言 需要注意,如下操作需要进行网络代理,否则会出现安装失败的情况 安装 第一步 — 安装MingGW (1)进入官网下载 (2)下载完成之后,双击exe文件 (3)点击Install &#x…

Python设计模式 - 简单工厂模式

定义 简单工厂模式是一种创建型设计模式,它通过一个工厂类来创建对象,而不是通过客户端直接实例化对象。 结构 工厂类(Factory):负责创建对象的实例。工厂类通常包含一个方法,根据输入参数的不同创建并返…

通信协议—Modbus

1、modbus简介 Modbus服务器:接收处理来自客户端的请求,并返回相应的响应; Modbus客户端:向Modbus服务器发送请求,并接收服务器返回的响应的设备或程序; 2、modbus poll调试工具下载 modbus poll用于测…

SpringCloud跨服务远程调用

随着项目的使用者越来越多,项目承担的压力也会越来越大,为了让我们的项目能服务更多的使用者,我们不得不需要把我们的单体项目拆分成多个微服务,就比如把一个商城系统拆分成用户系统,商品系统,订单系统&…

从设备匠心到啤酒体验的全方位指南

从小型手工酿酒坊到大型现代化生产线,我们在经营之前,每一套设备的选择都是基于对精酿啤酒市场需求的洞察和自身品牌的定位。无论是追求传统风味的复刻,还是创新口味的实验,设备的灵活性与可控性都是决定成品能否达到预期的关键。…

【SpringCloud】创建新工程

前言 本文使用的是jdk17,mysql8。 以下用两个服务做演示: 订单服务:提供订单ID,获取订单详细信息。 商品服务:提供商品ID,获取商品详细信息。 对于订单服务和商品服务分别建立数据库: -- 订单服…

一款不写代码的开源爬虫工具!!【送源码】

爬虫,也被称为网络爬虫或网络蜘蛛,是一种自动化的网络机器人,其主要功能是按照一定的规则,自动浏览互联网并从网页中提取信息。 作为一个开发人员,相信大家都尝试过写一些爬虫,合理的利用一些爬虫工具&…

【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 35,连休两天~ 题目详情 [134] 加油站 题目描述 134 加油站 解题思路 前提:数组 思路:全局贪心算法:最小累加剩余汽油为负数,说明…

博客没人看啊?我分析是这些原因

1.封面 主题封面还是个性化封面?主题封面对系列化很友好,如下图左: 在目录中什么主题一目了然,个性化封面在目录中就略显杂乱。但是通过观察CSDN主页发现热榜文章清一色个性化封面。如果使文字封面就会显得很无聊。 所以从提高浏…

Orange_Pi_AIpro运行蜂鸟RISC-V仿真

Orange_Pi_AIpro运行蜂鸟RISC-V仿真 突发奇想,试一试Orange Pi AIpro上运行蜂鸟RISC-V的仿真。 准备 默认已经有一个Orange Pi AIpro,并且对设备进行一定的初始化配置,可以参考上一篇博文开源硬件初识——Orange Pi AIpro(8T&a…

零代码本地搭建AI大模型,详细教程!普通电脑也能流畅运行,中文回答速度快,回答质量高

这篇教程主要解决: 1). 有些读者朋友,电脑配置不高,比如电脑没有配置GPU显卡,还想在本地使用AI; 2). Llama3回答中文问题欠佳,想安装一个回答中文问题更强的AI大模型。 3). 想成为AI开发者,开…

运行时类型识别RTTI(typeid dynamic_cast)和虚函数机制的关系

1.typeid 2.dynamic_cast 指针类型决定了可以操作的内存范围大小 子类指针转化为父类类型的指针的一般是合法的: 父类的指针类型转化为子类类型指针,超过合法操作范围,不安全 两种转换:编译期的转换,运行时的转化 编译…

【Java】图书管理系统-控制台输出

项目原码压缩包在我主页的资源中免费领取。(在IDEA中运行,启动类在src -> Main 中运行) 图书管理系统 设计一个简单的控制台输出的图书管理系统,我们首先需要明确其基本功能、设计内容以及设计要求。这个系统可以包括以下几个…

解决Windows中端口占用导致服务启动失败

解决Windows中端口占用导致服务启动失败 在cmd窗口中使用netstat -ano | findstr "3306"来查看哪个线程占用了3306端口。 下面的图片里面表示一个pid为5196的进程占用了端口 接着可以在cmd窗口中使用tasklist | findstr "5196" 根据pid查询进程名称 通过…

LVS三种负载均衡模式:NAT、Tunneling和DR的技术对比

1. LVS-NAT 模式的特性 IP使用:RS(Real Server)应使用私有地址,RS的网关必须指向DIP(Director IP)。网络范围:DIP和RIP必须在同一个网段内。数据包处理:请求和响应报文都需要经过Di…