算法刷题—树

news2024/11/20 8:29:50

1.什么是树

        1.1树的概念

        树(Tree)是n(n>0)个节点的有限集,n=0称为空树。

在任意一个棵非空树中:

        1.有且仅有一个特定的称为根(Root)的结点;

        2.当n>1时,其余节点可以分为m个(m>0)互不相交的T1,T2.....Tm其中每一个集合本身也是一课树并且称为根的子树(SubTree)

注:

        在一棵完整的树中,根节点时唯一的;

        子树的个数是不限的但是也是互不相交的

 

         1.2 节点度

        节点度(Degree)算法为每个节点计算与其相连的边的数量;当边上有权重时,则计算权重的总和。节点度是面向节点的浅层(≤ 1层)计算,是一种最简单、最高效的图算法,在科学计算、特征提取、超级节点识别等领域扮演着至关重要的角色。

A的度为2

B的度为1

C的度为2

D的度为3

...

 

        1.3 树的度

树的度指的是结点拥有的子树称为子树的度。一棵树中,最大的节点的度称为树的度。树由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系

上面树的度就是3

2.树的表示

        2.1双亲表示法

我们假设以一段连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。也就是说,每个结点除了直到自己是谁外,还要直到自己的双亲在哪里。如图

通过一个编号来指明节点,再通过一个字段来指明节点的父级

有了这样的结构定义,我们就可以实现双亲定义法了。由于跟结点没有双亲,所以我们约定根结点的位置域设置为-1,这就意味着,我们所有结点都直到他双亲的位置。如图的树结构和双亲表示法的图表。

我们可以通过上面快速的找到结点的双亲。

存在问题:

        但是我们要知道结点的孩子怎么办?那就只有遍历整个结构了。 

        2.2孩子表示法

        2.2.1 孩子表示法一:每一个节点有一个域,域等于树的度

指针域的个数等于树的度。(树的度是树各个结点度的最大值)。(结点拥有的子树称为结点的度)。

 存在问题:

空间浪费

^这个符号就是代表当前这个指针域并没有用到。这样如果树的各结点的度差距过大的话,显然非常浪费空间。那我们为什么不按需分配空间呢?这样就有第二种方案了

        2.2.2 孩子表示法二:

每个结点指针域的个数等于该结点的度,我们专门来取一个位置来存储结点指针域的个数。如图

 显然,方案二克服了浪费空间的缺点,

存在问题:

由于各个结点的链表结构是不相同的,在加上要维护结点的度的数值,在运算上显然有损耗。
能否有更好的方法?既可以减少浪费,又能使结点结构相同。


我们把每一个结点放入顺序存储结构中是合理的,但是每个结点的孩子多少是不确定的,所以我们再对每个结点的孩子建立一个单链表来体现他们的关系。
这就是我们的孩子表示法。


具体办法:把每个结点的孩子排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针有组成一个线性表,采用顺序存储结构,存进一个一维数组。如图 所示

 

 

 存在问题:

不好去找双亲节点

        2.2.3 孩子表示法二:

我们可以改进一下。把双亲表示法和孩子表示法综合一下,加一个双亲域。如图。(双亲孩子表示法)

 

        2.3 二叉树

 

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分  。

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点  。

特殊类型:

1、满二叉树:如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树 

2、完全二叉树:深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树 。

二叉树 从左到右 一次编号与满二叉树对应编号一样则称为完全二叉树

 上图中 一一对应 所以就是一个完全二叉树

 

完全二叉树的特点是叶子节点只可能出现在层序最大的两层上,并且某个节点的左分支下子孙的最大层序与右分支下子孙的最大层序相等或大1。

推论

 推论1:

对于位置为K(K为父节点序号)的节点,左子节点=2*K+1 右子节点=2K+2

验证: C=2*A+2  F=2*C+1 

推论2:

最后一个非叶子节点的序号为 (N/2)-1 N为数组存储二叉树的 length 

验证: 6/2-1=2  -------> C

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式文件存储系统minio

结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。 特点:高度组织化和格式化,可以用二维表结构来逻辑表达和实现的数据…

5 - 1 判断题

1.一棵有124个结点的完全二叉树,其叶结点个数是确定的。T 什么是完全二叉树?(会的可以跳过) 完全二叉树:一棵深度为k的有n个结点的二叉树,对其结点按从上至下,从左至右的顺序进行编号&#xff…

学习大数据需要具备什么基础么?

Python优势明显,应用领域超多 如果要推荐一种人人都能掌握的编程语言,应该没有比Python更合适的了。 Python 简单易学,用途广泛,适合零基础入门,在编程语言排名上升最快,能完成数据挖掘、机器学习、实时计…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.25 RocketMQ 安装

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.25 RocketMQ 安装5.25.1 RocketMQ 下载5.25.2 安装…

眼见为实:关于微服务熔断这几个知识点,你可能理解错了

“ 微服务熔断,是当微服务中某个子服务,发生异常不可用,其他服务在进行远程调用时不能正常访问而一直占用资源,导致正常的服务也发生资源不能释放而崩溃,这时为了不造成整个微服务群瘫痪,进行的保护机制” …

漏洞分析|Apache Airflow Pinot Provider 命令注入漏洞

项目介绍 Airflow 是一个使用 python 语言编写的 data pipeline 调度和监控工作流的平台。Airflow 是通过 DAG(Directed acyclic graph 有向无环图)来管理任务流程的任务调度工具, 不需要知道业务数据的具体内容,设置任务的依赖关…

【头歌实验】四、Python分支结构

文章目录>>>第1关:判断闰年任务描述案例分析相关知识条件表达式分支语句测试说明参考答案>>>第2关:计算快递费用任务描述案例分析相关知识分支结构向上取整的函数ceil测试说明参考答案>>>第3关:成绩等级判定任务描…

同惠TH2830精密LCR数字电桥性能特点

TH283X系列是新一代低预算成本,高性能紧凑型LCR数字电桥,采用最新工艺和高密度电路设计,浓缩大型LCR测试仪的精华、紧凑、小巧。取消传统机械电源开关,采用软件控制电源开关。0.05%的基本精度和良好的测试稳定性可与高端机型媲美。…

关于环2数字资产html网页设计

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | | HTML期末大学生网页设计作业 HTML:结构 CSS:样式 在操作方面上运用了html5和css3, 采用了divcss结构、表单、超…

下一代Ajax技术 — Fetch的学习与使用

一、初识fetch Fetch被称为下一代Ajax技术,采用Promise方式来处理数据。是一种简洁明了的API,比XMLHttpRequest更加简单易用。 XMLHttpRequest 我们先来看看使用纯XMLhttpRequest来实现一次简单ajax请求的代码: //获取XMLHttpRequest实例对象 const x…

TypeScript(三)面向对象

TypeScript 类的定义 我们可以使用class关键字来定义一个类; 我们可以声明类的属性:在类的内部声明类的属性以及对应的类型 如果类型没有声明,那么它们默认是any的; 我们也可以给属性设置初始化值; 在默认的strictPr…

MSG企业行·AI+医疗专场成功举办!!昇思MindSpore助力智慧医疗深度发展!

【MSG企业行AI医疗】 11月19日下午,【MSG企业行AI医疗】线上交流会成功举办! 昇思MindSpore开源社区联合大连人工智能生态创新中心、深圳大学、武汉理工大学、摩赛恩科技、连心医疗、众享未来融合研究院,邀请到了5人工智能与医疗行业嘉宾&a…

利用navicat定时传输数据到另一个库

需求:每天定时6点,12点,18点将SQLserver的数据推送到mysql库中 之前就看到navicat有个自动运行(有的版本叫计划),但是不会用,刚好趁这个机会学一学 提前说一点,可能需要先换成admin…

antd:ConfigProvider+getPopupContainer解决筛选框遮挡问题(及其他浮层问题)

一. 问题场景二. 解决方案三. 代码示例一. 问题场景 当表格高度太低(下图业务场景出现在数据条数太少时),column中有筛选框,可能会出现筛选框被遮挡的问题: 这是因为filter的下拉菜单渲染在table的表头栏&#xff0…

运算放大器的理解与应用

运算放大器的理解与应用 运算放大器简称运放,由于早期应用于模拟计算机中,用以实现数学运算,故得名“运算放大器”。主要是用在模拟电路中,比如放大器、比较器、模拟运算器,是电子工程师经常要用到的器件。运算放大器…

145646-22-6|表位肽EQKLISEEDL

c-Myc Peptide Trifluoroacetate 是一种合成肽,与人 c-myc 蛋白的 C-末端氨基酸 (410-419) 相对应,参与调控与生长有关的基因的转录过程。c-Myc Peptide Trifluoroacetate is a synthetic peptide corresponding to the C-terminal amino acids (410-419…

开源共建 | 中国移动冯江涛:ChunJun(原FlinkX)在数据入湖中的应用

ChunJun(原FlinkX)是一个基于 Flink 提供易用、稳定、高效的批流统一的数据集成工具。2018年4月,秉承着开源共享的理念,数栈技术团队在github上开源了FlinkX,承蒙各位开发者的合作共建,FlinkX得到了快速发展…

Spring Security验证码配置化开发

背景 在前两篇文章中给大家介绍了Spring Security的认证流程,包含对项目的定制化处理,可以明白security的设计还是比较强大的,通过一系列的过滤器注册的过滤器链,对流程进行链式的处理。 今天介绍一种以配置器的方式处理验证码生…

Day11--配置tabBar效果

1.创建tabBar分支 我的操作: 1》在其根路径下按住“shift”和鼠标右键进入powerShell界面,然后输入创建一个分支tabBar. ****************************** ****************************** ****************************** ****************** 2.创建ta…

生产质量管理系统有哪些功能?

随着中国市场经济的快速发展,中国产品正经历着“中国制造”向“中国创造”的转变,在这个过程中,企业经营也逐渐从低成本生产管理向质量经营方向发展,企业已经认识到质量的重要性,企业对质量管理的有效性也提出了更高的要求。 作为…