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

理解树的结构-算法通关村

理解树的结构-算法通关村


1.树的结构

  • 树是一个有n个有限节点组成一个具有层次关系的集合,每个节点有0个或者多个子节点,没有父节点的节点称为根节点,也就是说除了根节点以外每个节点都有父节点,并且有且只有一个。树的种类比较多,最常见的是二又树,基本结构如下:
  • 参考上面的结构,可以很方便的理解树的如下概念:
    1. 节点的度:一个节点含有的子节点的个数称为该节点的度;
    2. 树的度:一棵树中,最大的节点的度称为树的度,注意与节点度的区别;
    3. 叶节点或终端节点:度为0的节点称为叶节点;
    4. 非终端节点或分支节点:度不为0的节点;
    5. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
    6. 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
    7. 兄弟节点:具有相同父节点的节点互称为兄弟节点;
    8. 节点的祖先:从根到该节点所经分支上的所有节点;
    9. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
    10. 森林:由m(m>=0)棵互不相交的树的集合称为森林;
    11. 无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;
    12. 有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;
    13. 二叉树:每个节点最多含有两个子树的树称为二叉树;

2 树的性质

  • 性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>0)
    性质2:深度为k的二叉树至多有2^k -1个结点(k>0)
    性质3:对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
    性质4:具有n个结点的完全二叉树的深度必为 log2(n+1)
    性质5:对完全二叉树,若从上至下、从左至右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1 时为根,除外)
  • 满二叉树就是如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。
  • 这棵二又树为满二叉树,也可以说深度为k=4,有2^k-1=15个节点的二又树。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大 值,并且最下面一层的节点都集中在该层最左边的若干位置。

3 树的定义

  • 定义二叉树

  •   public class TreeNode {int val;TreeNode left;TreeNode right;}
    
  • 定义N叉树

  •   public class Node {public int val;public List<Node> children;}
    

4树的遍历方式

  • 二叉树的遍历方式有层次遍历和深度优先遍历两种:
    • 深度优先遍历:先往深走,遇到叶子节点再往回走。
    •广度优先遍历:一层一层的去遍历,一层访问完再访问下一层。
    这两种遍历方式不仅仅是二叉树,N树叉也有这两种方式的,图结构也有,只不过我们更习惯叫广度优先和深度优先,本质是一回事。
    深度优先又有前中后序三种,记住一点:前指的是中间的父节点在遍历中的顺序,只要大家记住前中后序指的就是父节点在访问中的顺序就可以了。
    前序遍历:中左右 中序遍历:左中右 后序遍历:左右中

5 通过序列构造二叉树

  • 前面我们已经介绍了前中后序遍历的基本过程,现在我们看一下如何通过给出的序列来恢复原始二叉树,看三个序列:
    (1)前序:1 2 3 4 5 6 8 7 9 10 11 12 13 15 14
    (2)中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
    (3) 后序:8 7 6 5 4 3 2 10 15 14 13 12 11 9 1

5.1前中序列复原二叉树

  • 先看如何通过前中序列复原二叉树:

  • (1)前序:1 2 3 4 5 6 8 7 9 10 11 12 13 15 14
    (2)中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 12

  • 第一轮
  • 我们知道前序第一个访问的就是根节点,所以根节点就是1
    中序遍历的特点是根节点的左子树的元素都在根节点的左侧,右子树的元素都在根节点的右侧,从中序遍历序列我们可以划分成如下结构:

  • 前序中序划分:
    中序序列划分:[3 4 8 6 7 5 2 ] 1 [10 9 11 15 13 14 12]
    前序序列划分:1 [2 3 4 5 6 8 7] [9 10 11 12 13 15 14]
  • 上面前序序列第一个括号里的都是左子树的元素,第二个括号一定都是右子树的元素。参照中序的两个数组划分的。我们看到前序中7之前的元素都在中序第一个数组中,9之后的所有元素就在第二个数组种,所以我们从7和9之间划分。
    由此,画图表示一下此时知道的树的结构为:

  • 第二轮
  • 我们先看两个序列的第一个数组:
    前序:2 3 4 5 6 8 7 中序:3 4 8 6 7 5 2
    此时又可以利用上面的结论划分了:根节点是2,然后根据2在中序中的位置可以划分为:

  • 序列
    前序: 2 [3 4 5 6 8 7]
    中序:[3 4 8 6 7 5 ] 2
  • 此时树的结构为:

  • 第三轮:
  • 对 3 4 5 6 8 7 继续划分 : 前序:3 [4 5 6 8 7] 中序:3 [ 4 8 6 7 5 ] 此时结构为:

  • 第四轮
  • 对 4 5 6 8 7 继续划分:前序: 4 [5 6 8 7 ] 中序:4 [8 6 7 5 ]

  • 第五轮:
  • 对 5 6 8 7 继续划分:前序:5 [6 8 7 ] 中序:[8 6 7] 5

  • 同理,对序列 [10 9 11 15 13 14 12],进行划分:


5.2 通过中序和后序序列恢复二叉树

  • 通过中序和后序也能恢复原始序列的,唯一的不同是后序序列的最后一个是根节点,中序的处理也是上面一样的过程:
    前序:12345687910 1112 1315 14
    中序: 3486752110911 15 13 14 12
    后序:876543210 15 14 13 12 1191
    可以自行试一试,不再赘述。
    问题:为什么前序和后序不能恢复二叉树
    既然上面两种都行,那为什么前序和后序不行呢?我们看上面的例子:
    (1) 前序: 123456879 10 1112 13 15 14
    (2) 后序:87654321015 141312 1191
    后序:876543210 15 14 13 12 1191
    可以自行试一试,不再赘述。
    问题:为什么前序和后序不能恢复二叉树
    既然上面两种都行,那为什么前序和后序不行呢?我们看上面的例子:
    (1) 前序: 123456879 10 1112 13 15 14
    (2) 后序:87654321015 141312 1191
  • 根据上面的说明,我们通过前序可以知道根节点是1,通过后序也能知道根节点是1,但是中间是怎么划分的呢?其他元素哪些属于左子树,哪些属于右子树呢?很明显通过两个序列都不知道,所以前序和后序序列不能恢复二叉树。

相关文章:

理解树的结构-算法通关村

理解树的结构-算法通关村 1.树的结构 树是一个有n个有限节点组成一个具有层次关系的集合&#xff0c;每个节点有0个或者多个子节点&#xff0c;没有父节点的节点称为根节点&#xff0c;也就是说除了根节点以外每个节点都有父节点&#xff0c;并且有且只有一个。树的种类比较多…...

金融知识分享系列之:支撑阻力

金融知识分享系列之&#xff1a;支撑阻力 一、支撑阻力原理二、支撑阻力作用1.识别市场资金的预期2.作为入场和平仓的重要参考 三、寻找支撑阻力四、延伸思考五、支撑阻力总结 一、支撑阻力原理 支撑阻力核心要素&#xff1a; 锚定效应订单驱动 支撑阻力原理&#xff1a; 市…...

如何使用Excel创建一个物品采购表

在企业的日常运营中&#xff0c;物品采购是一个常见且重要的活动。有效的采购管理不仅可以确保企业及时获得所需物资&#xff0c;还可以控制成本、提高效率。Microsoft Excel是一个功能强大的工具&#xff0c;它可以帮助我们创建和管理物品采购表。本文将详细介绍如何使用Excel…...

容器中的大模型(三)| 利用大语言模型:容器化高效地部署 PDF 解析器实践...

作者&#xff1a;宋文欣&#xff0c;智领云科技联合创始人兼CTO 01 简介 大语言模型&#xff08;LLMs&#xff09;正逐渐成为人工智能领域的一颗璀璨明星&#xff0c;它们的强大之处在于能够理解和生成自然语言&#xff0c;为各种应用提供了无限可能。为了让这些模型更好地服务…...

java采集小程序联合航空官方

本文仅限学习研究讨论,切忌做非法乱纪之事 中国联合航空有限公司&#xff08;以下简称“中国联合航空”&#xff09;总部位于北京&#xff0c;现为中国东方航空股份有限公司&#xff08;以下简称“东航”&#xff09;旗下的全资子公司。中国联合航空成立于1986年12月26日&#…...

【力扣每日一题】lc1793. 好子数组的最大分数(单调栈)

LC1793. 好子数组的最大分数 题目描述 给你一个整数数组 nums &#xff08;下标从 0 开始&#xff09;和一个整数 k 。 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i1], ..., nums[j]) * (j - i 1) 。 一个 好 子数组的两个端点下标需要满足 i < k < j 。 请…...

ES的集群节点发现故障排除指南(1)

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容。 英文原文&#xff08;官网&#xff09; 集群节点发现是首要任务 集群互连&#xff0c;重中之重&#xff01; 在大多数情况下&#xff0c;发现和选举过程会迅速完成&#xff0c;并且主节点会长时间保持当选状…...

使用html+css制作一个发光立方体特效

使用htmlcss制作一个发光立方体特效 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Documen…...

贵州省二级分类土地利用数据(矢量)

贵州省&#xff0c;地处中国西南腹地&#xff0c;地貌属于中国西南部高原山地&#xff0c;境内地势西高东低&#xff0c;自中部向北、东、南三面倾斜&#xff0c;平均海拔在1100米左右。贵州高原山地居多&#xff0c;素有“八山一水一分田”之说。全省地貌可概括分为&#xff1…...

通过nginx+xray服务搭建及本地配置

一、xray服务配置 下载&#xff1a;https://github.com/XTLS/Xray-core 进入下载界面 这里我选择的是Xray-linux-64.zip 将文件解压到 /usr/local/xray 编辑配置文件/usr/local/xray/config.json uuid可以在v2ray客服端自动生成&#xff0c;也可以在UUID v4 生成器 - KKT…...

第一节 Axure RP产品经理原型进阶学习

第一天 1、认识RP9 Axure RP 9&#xff0c;Axure RP 9是美国 Axure Software Solution公司的旗舰产品&#xff0c; 是一个快速的原型工具&#xff0c;常用于各项网络设计&#xff0c;包括了原型图、线框图等等。 要进行原型设计&#xff0c;将文字性文档转变为互动性的可视画…...

Linux实战笔记(三) 文件压缩

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 Linux 系统中常用的文件压缩方式 0、序言 在 Linux 系统中&#xff0c;存在许多打包或压缩文件的工具 这篇文章会对一些常用的工具进行分类整理和介绍 如果只是需要知道怎么对不同格式的文件做解压缩&#xff0c;可以直…...

树形递归模板

详情参考CSDN链接: https://www.cnblogs.com/lidar/p/12972792.html public class Menu {// 菜单idprivate String id;// 菜单名称private String name;// 父菜单idprivate String parentId;// 菜单urlprivate String url;// 菜单图标private String icon;// 菜单顺序private …...

Python实战:Pandas数据合并与重塑

本文将深入探讨Pandas库在数据合并与重塑方面的强大功能。我们将涵盖多种数据合并方法&#xff0c;如merge、join、concat等&#xff0c;以及数据重塑的技巧&#xff0c;如pivot_table、merge_asof等。 一、引言 Pandas是一个强大的Python数据分析库&#xff0c;它提供了丰富…...

如何理解 Linux 命令行参数与环境变量7

一、命令行参数 1.1参数介绍 在写C语言程序时&#xff0c;main函数是否可以带参数呢&#xff1f;------ 是可以的 int argc: 命令行参数的个数char *argv[ ]: 字符指针数组&#xff08;指向各个命令行参数的字符指针所构成的数组&#xff09; 我们写一段代码来打印一下看这…...

奥特曼回应GPT5

欢迎再次与大家会面&#xff01;在积累了大量的信息和趋势后&#xff0c;今天我们将深入了解 Sora、OpenAI 董事会、以及近期与其有关的所有声讨。我们将直接跳入与 OpenAI 首席执行官 Sam Altman 的深度访谈&#xff0c;探讨从 AGI 到 GPT-5 的未来&#xff0c;以及 Sam 对人工…...

QT----给程序添加上任务栏托盘图标和退出

让我们的程序拥有任务栏托盘图标&#xff0c;实现程序后台运行&#xff0c;退出等功能 1、关闭程序保持后台 重写关闭事件,忽略点击窗口关闭 void MainWindow::closeEvent(QCloseEvent *event) {// 隐藏窗口&#xff0c;而不是真正关闭setVisible(false);// 忽略关闭事件&am…...

arm地址对齐的总结

static void axi_azx_writeb(u8 value, u8 __iomem *addr) { u32 data; u32 offset; offset (u64)addr & 0x03; // 编译器不允许地址做& 操作时要强转为数据 addr (u8 __iomem *)((u64)addr & 0xFFFFFFFFFFFFFFFC); // __iomem是个64位的地址 u8表示从这个地址…...

就业班 2401--3.13 走进网络

走进网络 长风破浪会有时&#xff0c;直挂云帆济沧海。 1.认识计算机 1.计算机网络是由计算机和通讯构成的&#xff0c;网络研究的是“通信”。 ------1946 世界上第一台计算机 2.终端&#xff1a;只有输入和输出功能&#xff0c;没有计算和处理功能。 3.数据&#xff1a;一串…...

SWIFT介绍和学习(简单入门级别)

SWIFT介绍和学习 SWIFT功能介绍SWIFT快速使用LLM及LLM最佳实践&#xff08;LLM系列文章&#xff09;部署指南 vllm非官方介绍资料 项目地址&#xff1a;https://github.com/modelscope/swift 任何有疑惑的地方&#xff0c;参考项目首页readme寻求答案 SWIFT功能介绍 SWIFT&…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...