力扣系统刷题-树(一)

放松了一周,也一周都没写题了,接下来,我做题的方式可能会更趋向于成体系的学习,今天就先从树的章节开始学起,主要参考的学习资料还是博客,知乎等网上较为系统的教材,涉及到的参考内容我都会进行标注,并以力扣题目作为导向来学习.

一.树

1. 什么是树

根据维基百科的定义:在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  • 每个节点都只有有限个子节点或无子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;
  • 树里面没有环路(cycle)

2. 树的一些重要的术语

  • 节点的度:一个节点含有的子树的个数称为该节点的度;
  • 树的度:一棵树中,最大的节点度称为树的度;
  • 叶节点或终端节点:度为零的节点;
  • 非终端节点或分支节点:度不为零的节点;
  • 父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  • 深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0;
  • 高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0; 堂兄弟节点:父节点在同一层的节点互为堂兄弟;
  • 节点的祖先:从根到该节点所经分支上的所有节点; 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  • 森林:由m(m>=0)棵互不相交的树的集合称为森林;

3. 树的存储结构

主要有以下三种存储方式:
(1)双亲表示法 : 该存储方式,对每个结点进行定义的时候,会包含自己的数据域(即该结点的数据)和双亲的指针域(即双亲的地址).
(2)孩子表示法 : 该存储方式,将每个结点的孩子结点排列起来,以但链表作为存储结点,使得n个结点有n个孩子链表,并将n个链表的头指针组成一个线性表,采用顺序存储结构,存放在一个一维数组中.因此线性表有一个数据域(存储当前结点的数据)和一个指针域(存储第一个孩子的地址),对于n个孩子链表中,每个孩子结点有一个child域(存储某个结点在表头数组中的下标)和一个next域(存储指向某结点的下一个孩子结点的指针).
(3)孩子兄弟表示法:该存储方式,每个结点包含三个域,分别为数据域(存储当前结点的数据),firstchild域(第一个孩子结点的存储地址),rightsib域(存储当前结点的右兄弟结点的存储地址).
以上是对树存储方法的介绍,但是整体而言,树主要有以下几种分类:
在这里插入图片描述
在这里插入图片描述
接下来,按照以上的介绍,分别进行汇总学习.

二 . 二叉树

1.二叉树的定义

二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树( 即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。与树相似,二叉树也以递归的形式定义。二叉树是n (n≥0) 个结点的有限集合:或者为空二叉树,即n=0。或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
二叉树是有序树,若将其左、右子树颠倒,则成为另一棵不同的二叉树。即使树中结点只有一棵子树,也要区分它是左子树还是右子树。二叉树的5种基本形态如图所示。
在这里插入图片描述

2.二叉树的存储结构

(1)顺序存储结构::使用一组地址连续的存储单元依次自上而下,从左往右存储每个结点的数据,用空值表示空结点.
(2)链式存储方式:使用二叉链表进行存储,每个结点右lchild(存储左孩子的存储地址),数据域(存储当前结点的数据),rchild(存储右孩子的存储地址).

3.二叉树的遍历

不论二叉树的类型,要想去访问一棵树的每个节点,都是共通的,主要有以下四种遍历方式:
(1)先序遍历(根左右)
当二叉树非空时,先访问根结点,之后访问该跟节点的左子树,再之后是右子树,对应力扣的题目:144. 二叉树的前序遍历,树是链式存储方式进行表示的,
在这里插入图片描述在这里插入图片描述
按照思路,选用递归的方式去做,直到递归到空结点,实现如下:
在这里插入图片描述
(2)中序遍历(左根右)
当二叉树非空时,先访问左结点,之后访问该节点的根结点,再之后是右结点,对应力扣的题目:94. 二叉树的中序遍历,树是链式存储方式进行表示的,
在这里插入图片描述在这里插入图片描述
举一反三,那么只需要更改返回数组的位置即可.实现如下:
在这里插入图片描述
(3)后序遍历(右根左)
当二叉树非空时,先访问左结点,之后访问该节点的根结点,再之后是右结点,对应力扣的题目:145. 二叉树的后序遍历
在这里插入图片描述
只需要将返回数组放在最后就可以了.
在这里插入图片描述
(4)层序遍历
层序遍历是需要一层一层去遍历树的结点,主要的遍历过程如下图所示:
在这里插入图片描述
对应的力扣题目是:102. 二叉树的层序遍历
在这里插入图片描述
实现思路的话,使用队列的思想,先进先出,先将头结点存储在队列内,遍历队列,存储该层的所有结点的值,并将非空遍历到的结点的非空结点存储到队列内,实现结果如下:
在这里插入图片描述
在这里需要注意的是,python中队列的使用,主要包含以下几个重要的使用方法:

import collections
#定义
queue = collections.deque() #不指定长度
queue = collections.deque(maxlen=num) #指定长度#进队列
queue.append('a')  #单个元素从尾插入
que.appendleft('A')  # 单个元素从头插入
queue.extend(['D', 'E'])  #可迭代对象
queue.insert(3, 'T') #指定位置插入#出队列
queue.pop()  #从最右边出
queue.popleft()   #从头出#删除
queue.remove('T')  #删除某个元素
queue.clear()    #清空整个队列#复制
queue_b = queue.copy()

和传统的先进先出规则有点不同,添加了更多灵活的操作.

4.由遍历序列构造二叉树

由遍历序列可惟一确定一个二叉树的方式有三种:(1)先序序列+中序序列 (2)后序遍历+中序遍历 (3)层序序列+中序序列
以第一种方式:先序遍历+中序遍历进行讲解:先序序列的遍历方式是根左右,中序遍历是左根右,那么先序序列的第一个就是整棵树的根,那么只需要在中序序列内找到根的位置,即可将树分为左子树和右子树,在对每个子树,使用相同的方式确认根,再分,直到遍历结束,整个树的构造就结束了.后序序列还有层次序列和这个方式是相同的,那么为什么说其余三种加上中序遍历就可以惟一确认呢?我的理解是,取决于二叉树的性质根的惟一性,只要能惟一确定根,那么就可惟一确定左子树和右子树,以此类推就可以获得,只是实现的思想不一样,根据这个实现思路,对应于力扣的105. 从前序与中序遍历序列构造二叉树,进行解答
在这里插入图片描述
先序遍历根左右,中序遍历左根右,先有先序序列的根在中序序列确认左子树和右子树,再在先序序列迭代去确认左子树和右子树的根,实现过程和结果如下所示:
在这里插入图片描述
递归调用该函数,从而实现树的构建.

未完待续…

Reference

树的分类
维基百科-树的定义
树的细节讲解
python中队列的使用细节

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

InfluxDB Studio 下载,时序数据库Windows图形界面操作

下载地址: https://github.com/CymaticLabs/InfluxDBStudio/releases解压缩后,双击 InfluxDBStudio.exe 运行。 参考 windows下 influxDB 操作工具 InfluxDBStudio 吐槽 现在 CSDN 太恶心了,动不动就让订阅或者积分下载资源。诚然&#…

主机组装笔记

参考资源:B站【装机教程】全网最好的装机教程,没有之一,仅供探讨学习 9大部件一览 其中得到固态和机械,是硬盘,存储空间,可以只选固态 CPU,主要有 AMD 和 Intel (AMD,基板的背面布…

nvm的下载和使用(Windows)

NVM(Node Version Manager)是一个用于管理多个Node.js版本的工具,它允许用户在同一台机器上安装和使用多个Node.js版本。 一、NVM的基本功能 多版本支持:NVM允许用户在同一台机器上安装多个Node.js版本,方便处理不同…

docker:在官方停止国内服务的情况下安装使用docker

前言 很烦,前段时间docker官方已经全面停止国内网络访问了,但业务又依赖docker,所以这里只能通过科学的方案来处理这件事: 系统:ubuntu 22.04 desktop 目的:在官方停止国内服务的情况下,安装使用docker 关键技术:科学工具(小猫猫) 安装科学工具 没有安装包的,可以自…

Re常见简单密码

Re常见简单密码 起码没有Crypto专项那么柜物。。。 文章目录 Re常见简单密码1. RC4算法2. TEA算法3. XTEA算法4. XXTEA算法5. DASCTF strangeprograme参考 C语言stdint.h提供如下类型 int8_t 八位有符号整数 uint8_t 八位无符号整数 int16_t int32_t int64_t 64为有符号整数c…

定时器介绍

定时器介绍 STM32F103C8T6微控制器内部集成了多种类型的定时器,这些定时器在嵌入式系统中扮演着重要角色,用 于计时、延时、事件触发以及PWM波形生成、脉冲捕获等应用。下面是对STM32F103C8T6中几个定时器的 简单介绍:TIM1:这是一…

细数那些令人瞩目的内网穿透工具

在日常工作场景中,我们时常面临需要将本地网络中的特定端口(如80、3306等)对外开放,以便让远程用户或设备跨越局域网界限进行访问的需求。为实现这一目标,端口映射(又称内网穿透)技术显得尤为重…

Qt项目【上位机十字屏开发】

效果图 说明 重写 QWidget 中的 paintEvent() 处理绘图事件&#xff0c;废话不多说&#xff0c;上代码 源码 #ifndef MYWIDGETFORM_H #define MYWIDGETFORM_H#include <QWidget>namespace Ui { class myWidgetForm; }enum MYTYPE{SIZEWIDTH,SIZEHEIGHT,TOPWIDTH,TOPHE…

Spring 循环依赖解决方案

文章目录 1. 循环依赖的产生2. 循环依赖的解决模型3. 基于setter/Autowired 的循环依赖1_编写测试代码2_初始化 Cat3_初始化 Person4_ 回到 Cat 的创建流程5_小结 4. 基于构造方法的循环依赖5. 基于原型 Bean 的循环依赖6. 引人AOP的额外设计7. 总结 IOC 容器初始化bean对象的逻…

Java并发类的主要API方法-CountDownLatch和CyclicBarrier

1.概念介绍 CountDownLatch 是一个计数器&#xff0c;计数器的初始值由创建它时指定。每次调用 countDown() 方法时&#xff0c;计数器会减1&#xff0c;直到计数器值变为0时&#xff0c;所有调用 await() 的线程都会被唤醒继续执行。 CyclicBarrier 是 Java 中另一个常用的同…

渗透率超50%,新能源汽车已成中国制造新名片

近日&#xff0c;乘联会公布了最新一期全国乘用车市场分析报告。报告显示&#xff0c;今年7月&#xff0c;中国乘用车市场零售销量173.2万辆&#xff0c;批发销量195.6万辆&#xff1b;同期&#xff0c;新能源乘用车零售销量87.8万辆&#xff0c;批发销量94.5万辆。按此计算&am…

DC-4靶机渗透测试

一、靶机下载地址 https://www.vulnhub.com/entry/dc-4,313/ 二、信息收集 1、主机发现 # 使用命令 nmap 192.168.145.0/24 -sn | grep -B 2 "00:0C:29:43:49:A5" 2、端口扫描 # 使用命令 nmap 192.168.145.217 -p- -sV 3、指纹识别 # 使用命令 whatweb "…

顺序表各种接口的实现(C)

线性表 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。在物理结构上并不一定是连续的&#xff0c;线性表在物…

旋转字符串 | LeetCode-796 | 模拟 | KMP | 字符串匹配

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️KMP算法练习题 LeetCode链接&#xff1a;796. 旋转字符串 文章目录 1.题目描述&#x1f351;2.题解&#x1fad0;2.1 暴力解法&#x1fad2;2.2 模拟…

c# 排序、强转枚举

List<Tuple<double,int>> mm中doble从小到大排序 mm本身排序 在C#中&#xff0c;如果你有一个List<Tuple<double, int>>类型的集合mm&#xff0c;并且你想要根据Tuple中的double值&#xff08;即第一个元素&#xff09;从小到大进行排序&#xff0c;同…

[Qt][对话框][下]详细讲解

目录 1.Qt内置对话框0.有哪些1.消息对话框 QMessageBox2.颜色对话框 QColorDialog3.⽂件对话框 QFileDialog4.字体对话框 QFontDialog5.输⼊对话框 QInputDialog6.进度条对话框 QProgressDialog 1.Qt内置对话框 0.有哪些 Qt提供了多种可复⽤的对话框类型&#xff0c;即Qt标准…

【启明智显技术分享】工业级HMI芯片Model3C/Model3A开发过程中问题记录笔记二

一、Model3C/Model3A芯片介绍 Model3C/Model3A是启明智显针对工业、行业以及车载产品市场推出的一款高性能、低成本的工业级HMI&#xff08;Human-Machine Interface&#xff0c;人机界面&#xff09;芯片。两颗芯片硬件PIN TO PIN&#xff1b;区别在于内置的PSRAM大小不同。该…

百度地图动态绘制台风轨迹

效果图如下: 台风测试数据获取 关键代码: /*** 动态绘制点和线*/drawMakerByAnimate () {const pointsMap = typhoneData.points;const title = typhoneData.tfid + typhoneData.name;if (!pointsMap || pointsMap.length === 0) {return;}if (this.markers.length > 0 &…

Godot《躲避小兵》实战之设置项目

通过之前的学习我们已经基本了解了godot的界面&#xff0c;知道如何创建项目以及节点。那么&#xff0c;从这一章节我们将进入godot官方给我们提供的一个2D游戏开发的小教程进行入手&#xff0c;这个游戏并不是我自己的作品&#xff0c;而是我通过学习完之后&#xff0c;对其进…

C#如何将自己封装的nuget包引入到项目中

问题 自己封装好了一个nuget包&#xff0c;但是不想上传到外网&#xff0c;想局域网使用&#xff0c;有两种方案 搭建私有nuget仓库放到离线文件夹中直接使用 第一种方式请请参考proget安装 下面主要是第二种方式 准备 新建类库项目 using System;namespace ClassLibrary…