DataStructure--Tree

news/2024/5/20 11:31:30/文章来源:https://blog.csdn.net/qq_37233070/article/details/130336442

文章摘录链接

1.树基本概念

计算机数据结构中的树就是对显示中的树的一种抽象(倒置现实中的树)。
image

1.1 树

有层次关系N(N≥0)个节点的有限集合空树:	N=0
非空树:	有且只有一个根节点

1.2 节点

根节点
分支节点
叶子节点前驱(父节点)
后继(子节点)

1.3 子树

除根外,可分为m个互不相交的有限集合

1.4 边

1.5 度

1.6 高度(深度、层次)

1.7 有序数/无序树

各节点的子树从左至右有/无次序。

2.树的性质

1
节点 = 总度数 + 1
节点的度 = 节点孩子(分支)个数2
度为m的树:各节点度的最大值为m任意节点的度 ≤ m至少一个节点的度 = m3
m叉树的区别:每个节点最多有m个孩子任意节点的度 ≤ m允许所有节点的度都 < m

image

2.树的存储结构

顺序存储对应的就是数组。
链式存储对应的就是链表。
再复杂的数据结构,要么是数组存储,要么是链表存储,再么是数组+链表存储。
image

2.1树的双亲表示法(顺序存储)

优点:可以快速找到某节点的父节点
缺点:无法快速找到某节点的子节点
image

2.2 树的孩子表示法(顺序存储 + 链式存储)

实际应用:hashmap
image

2.3 树的孩子兄弟表示法(链式存储)

image

3.森林

森林是m(m>0)颗 互不相交 树的集合既可以顺序存储,又可以链式存储。森林和二叉树转换:森林根节点间是兄弟。

image

4.二叉树

4.1 二叉树定义

Binary Tree.
节点的度 ≤ 2 的有序数。 `二叉树必须是有序的`。空树、只有根节点的树、只有左子树、只有右子树、左右子树都有

image

4.2 二叉树分类

4.2.1 满二叉树

每一层都铺满,只有最后一层是叶子结点。高为h,节点数 2^h - 1 。(原来m叉树公式带入而来:(m^h-1)/(m-1) )
只有最后一层有叶子结点
不存在度为1的节点
按层序从1编号,i的左子为2i,右子为2i+1,父为i/2

4.2.2 完全二叉树

从上往下,从左至右。
可以理解为满二叉树去掉最下层右边部分叶子结点的树。
image

4.2.3 二叉排序树

image

4.2.4 平衡二叉树

image

4.3 二叉树的存储结构

4.3.1 顺序存储

是将普通的二叉树当成完全二叉树来存的。并不是说只有完全二叉树才能顺序存储。
image

4.3.2 链式存储

默认删除步骤:
将右侧子节点替换要删除的节点,次之 左侧子节点替换。
image

5.如何访问二叉树

5.1 二叉树的遍历

5.1.1 先序遍历

image

5.1.2 中序遍历

image

5.1.3 后序遍历

image

5.1.4 层次遍历

利用先进先出队列。

5.2 线索二叉树

通过优化存储结构,增加前、中、后序遍历速度。不包含层次遍历。

线索化是指针对某一种遍历方式进行线索化,而不是针对二叉树进行线索化。
同一个二叉树,由于使用的遍历方式不同得到的线索二叉树是不同的。
image

5.2.1 前序遍历

image

5.2.2 中序遍历

image

5.2.3 后序遍历

image

6.二叉树应用场景

6.1 二叉查找树(BST)

6.1.1 概念

image

6.1.2 BST查找

因为BST的概念,查找只会往一个子树的方向查找,故时间复杂度就是层次高度。即O(log2n).

6.1.3 BST插入

先进行查找,确定插入位置。
插入的时间复杂度 = 查找插入位置 + 插入时间复杂度1 = O(log2n)

6.1.4 BST删除

时间复杂度(平均) = 查找插入位置 + 循环查找插入位置 = mO(log2n) = O(log2n)
时间复杂度(最差,当树是个单节点链接链表时)= O(n)
image

分三种情况:
1.删除度为0的节点直接删掉2.删除度为1的节点将该节点的前驱或后继直接连到该节点所在的位置即可。3.删除度为2的节点简单情况:要删除的几点前驱或后继节点的度为0,以按照删除度为1的节点的思路进行节点位置的调整。复杂情况:要删除的节点前驱或后继节点的前驱或后继为1或2,思路一样,但需要递归待替换的节点。

6.2 平衡二叉树(AVL)

首先是一个二叉查找树(BST),并增加了平衡要求。
应用实例:hashmap
image

注意:
AVL进行插入或删除会导致失衡,那么相应的引出调整失衡(即旋转)的概念。
调整的应是最小不平衡二叉树

6.2.1 失衡情况(4种)

旋转名字中的方向(如,左单、右单)指的是物理旋转的方向,可根据下面的实例看出来。

6.2.1.1 右单旋转(LL平衡旋转)

此种旋转适用于在当前节点的左孩子节点(第一个L)的左子树(第二个L)进行插入的情况。注意:旋转,挪节点时都以二叉查找树(BST)为前提。例:如下图,当前节点11的左孩子节点的左子树插入节点7.

image

6.2.1.2 左单旋转(RR平衡旋转)

此种旋转适用于在当前节点的右孩子节点(第一个R)的右子树(第二个R)进行插入的情况。注意:旋转,挪节点时都以二叉查找树(BST)为前提。例:如下图,当前节点14的右孩子节点的右子树插入节点16.

image

6.2.1.3 先左后右双旋转(LR平衡旋转)

需要先进行一次左旋转,再进行一次右旋转。
此种旋转适用于在当前节点的左孩子节点(第一个L)的右子树(第二个R)进行插入节点的情况,
以上概念为前提,又分为在该右子树下插入左节点和右节点两种情况。注意:两次旋转,挪节点时都以二叉查找树(BST)为前提。例:如下图,情况1:当前节点15的左孩子节点的右子树插入左节点10.情况2:当前节点15的左孩子节点的右子树插入右节点13.

image

6.2.1.4 先右后左双旋转(RL平衡旋转)

需要先进行一次右旋转,再进行一次左旋转。
此种旋转适用于在当前节点的右孩子节点(第一个R)的左子树(第二个L)进行插入节点的情况,
以上概念为前提,又分为在该右子树下插入左节点和右节点两种情况。注意:两次旋转,挪节点时都以二叉查找树(BST)为前提。例:如下图,情况1:当前节点15的右孩子节点的左子树插入左节点16.情况2:当前节点15的右孩子节点的左子树插入右节点18.

image

6.3 哈夫曼树

哈夫曼树中没有度为1的节点。
image

哈夫曼树不只有一个,如下图所示

image

6.3.1 哈夫曼树的构造

image

6.3.2 哈夫曼树的应用–哈弗曼编码

计算机间传递数据以二进制流进行,若采取固定长度编码,则会浪费空间。
进而衍生出可变长度编码,但解码会有问题。
最后衍生出前缀编码,
最后利用哈夫曼树得到字符的前缀,最终得到哈弗曼编码。最终叶子节点带权路径总长度之和就是电文的长度。

image
image

7.树了解流程

参考链接
-> 二叉树 -> 满二叉树 -> 完全二叉树 -> 二叉查找树(Binary Search Tree - BST,又称二叉排序树、二叉搜索树) -> 平衡二叉搜索树 (Balanced binary search trees,又称AVL树、平衡二叉查找树) -> 红黑树(Red - Black Tree,一种自平衡二叉搜索树(BST)) -> B-Tree(B树) -> B+ Tree(B+树)

7.1 红黑树

红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST)

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

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

相关文章

java: Compilation failed: internal java compiler error

问题描述: 今天学习一个新的框架 Jbolt-v3.0,然后将它通过 IDEA 导入,运行报错,如下显示: 接着我尝试了百度上的解决方案,依然没有解决,遂即记录一下。 原因分析: 出现这种报错的原…

Linux下版本控制器(SVN) -服务器端环境搭建步骤

文章目录 进阶知识-Linux下版本控制器(SVN)4、服务器端环境搭建步骤4.1 安装服务器端程序4.2 验证是否安装成功4.3 创建并配置版本库4.4 配置 SVN对应的服务4.5 启动 SVN服务 本人其他相关文章链接 进阶知识-Linux下版本控制器(SVN) 4、服务器端环境搭建步骤 4.1 安装服务器端…

带你一步步实现代码开发平台——概述、实现模式、整体框架

概述 低代码开发平台是一种开发工具,它允许用户使用图形界面和少量编码来创建应用程序。这种平台的目的是加快应用程序开发速度,减少开发成本和技能门槛。目前,市场上有许多低代码开发平台可供选择,包括Microsoft Power Apps、Ou…

六、Golang的并发

Go语言的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为goroutine时,Go会将其视为一个独立的工作单元。这个单元会被调度到可用的逻辑处理器上执行。 Go语言运行时的调度器是一个复杂的软件,能管理被创建的所有goroutine并为其分配执…

Spring之Bean的配置与实例

Spring之Bean的配置与实例 一、Bean的基础配置1. Bean基础配置【重点】配置说明代码演示运行结果 2. Bean别名配置配置说明代码演示打印结果 3. Bean作用范围配置【重点】配置说明代码演示打印结果 二、Bean的实例化1. Bean是如何创建的2. 实例化Bean的三种方式2.1 构造方法方式…

NewBing 边栏快捷插件没有了!如何解决?如何脱离浏览器使用 New Bing?

作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

[世界读书日] 最好的书,都在博雅之中

今天是世界读书日(4月23日),还是谈谈读书。 我很少看到有人说读书不好的,但很少看到有人爱读书,也很少看到有人读到了好书。 好书、好读书、读好书,都是很稀缺的。 一、好书的作用 基本上,我们遇…

NFC 学习笔记 5 MFRC522读写器2 NDEF

NDEF简介 NDEF(NFC Data Exchange Format)是一种标准化的数据格式,用于将数据存储在NFC标签或智能手机中。该格式是NFC论坛定义的,目的是在不同的NFC设备之间交换信息。 NDEF格式可以存储各种类型的数据,例如URL、文本…

参数与非参数检验:理解差异并正确使用

数据科学是一个快速发展的领域,它在很大程度上依赖于统计技术来分析和理解复杂的数据集。这个过程的一个关键部分是假设检验,它有助于确定从样本中获得的结果是否可以推广到总体。 在这篇文章中,我们将探讨参数与非参数检验之间的区别&#…

第3章:select

1.最基本的select语句 select … from…select 字段1,字段2,…from 表名* 表中所有字段(列) 2.列的别名 字段1 as 别名1字段1 别名1as:alias(别名)可以省略如果别名有空格使用一对””引起来…

pycharml利用ddddocr和selenium识别验证码并登录

文章目录 1OCR2 ddddocr3使用案例4 常见问题代码详情获得XPATH方法 1OCR OCR (Optical Character Recognition,光学字符识别),是指电子设备(例如扫描仪或 数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符…

[Platforimio] LVGL +TFT_eSPI实现触摸功能

💥💥💞💞欢迎来到本博客❤️❤️💥💥 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ &#x…

【LeetCode训练营】反转链表 移除链表元素 详细图解 203,206

💌 博客内容:LeetCode 训练营 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这…

谁在成为产业经济发展的推车人?

区域发展的新蓝图中,京东云能做什么?它的角色是什么?这个问题背后,隐藏的不仅是京东云自身的能力和价值,更是其作为中国互联网云厂商的代表之一,对“技术产业”的新论证。 作者|皮爷 出品|产业家 关于云…

配置zabbix自定义监控项

1.需要安装zabbix-agent服务,使用的zabbix版本为5.0版本 参考:zabbix监控linux主机_Apex Predator的博客-CSDN博客 2.创建存放脚本目录并编辑监控服务的脚本(此处监控一下服务是否存活) mkdir /opt/zabbix_jb vi /opt/zabbix_jb/service_status.sh …

进阶必看 | 有关BIMer强推的5本书,看过的都竖大拇指!

大家好,还是我,建模助手。 本期的主题都是围绕着:热点。除了建模助手的品牌资讯之外,还有一些与行业相关的热点。 这不,4月23日是正好的世界读书日,给大家搞一波书籍推荐! 小编认为&#xff…

24从零开始学Java之如何正确地使用一维数组

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在之前的文章中,壹哥给大家讲解了java里的顺序结构、分支结构、循环结构等内容&#xff0…

pytest使用 一(安装、简单的测试用例、运行)

Pytest框架 — 1.Pytest测试框架介绍 - 知乎 2023最新pytest接口自动化测试框架,三天带你精通pytest,带你写出最好的代码!(已更新2023新版)_哔哩哔哩_bilibili 一、pytest安装 pip3 install pytest # 查看pytest版本…

【蓝桥杯省赛真题19】python完数及个数 青少年组蓝桥杯python编程省赛真题解析

目录 python完数及个数 一、题目要求 1、编程实现 2、输入输出 二、解题思路

Python 基础(十一):集合

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、声明集合1.1、使用 {} 声明集合1.2、声明空的集合1.3、自动过滤重复元素 二、添加…