数据结构与算法之树和二叉树的一些概念和性质

news2024/12/24 2:40:47

目录

前言

一、树的定义

二、树的若干术语

1.结点的度

2.叶子

3.双亲与孩子

4.兄弟

5.祖先

6.树的度

7.结点的层次

8.树的深度

9.有序树和无序树

10.森林

三、树的逻辑结构

四、树的存储结构

1.顺序存储

2.链式存储

五、二叉树

1.定义

2.二叉树的五种状态

3.树和二叉树之间的转换

1.树转二叉树

2.二叉树转树

六、二叉树的性质

七、参考资料


前言

        这边博客主要是介绍树和二叉树。

一、树的定义

        树是由n(n>=0)个结点组成的有限集合T,如果n>0,并且满足两个条件:

  1. 有且仅有一个结点称为根(root)
  2. 当n>1的时候,其余的结点分为几个互不相交的有限集合,每个集合本身又是颗树,被称为这个根的子树。

二、树的若干术语


图1.树

1.结点的度

        结点的度也就是当前节点的子结点的个数。

        例如在上图中A结点的度为3,B结点的度为2,H结点的度为1。

2.叶子

        度为0的结点。

3.双亲与孩子

        E是B的孩子,E是K和L的父结点

4.兄弟

        B、C、D为兄弟结点

5.祖先

        M的祖先结点为H、D、A

6.树的度

        树中最大结点的度

7.结点的层次

        根结点是第一层,根的结点为第二层,依次类推

8.树的深度

       树的深度指的是从根节点到树中任意节点的最长路径的长度。换句话说,树的深度是根节点到最深层节点的路径的长度。

9.有序树和无序树

        左右结点不能变的树为有序树,反之称为无序树。

10.森林

        两个或者两个以上的树组成森林

三、树的逻辑结构

        一个结点可能有多个直接后继,但只有一个直接前驱,且子树之间互不相交。

四、树的存储结构

1.顺序存储

    按照从上到下、从左到右的顺序存储。

    我们在结点和结点的双亲结点的个数存储树的信息。

     图2.树的顺序存储结构

    顺序存储有个缺点:我们需要存储所有的结点信息,当树只有左节点或者右节点的时候,我们需要再顺序表的位置补充好多个空节点,这样会造成存储空间的浪费,而且操作很不方便。依次我们一般使用顺序存储表示完全二叉树。

2.链式存储

        我们使用链表存储树。这样也有一个问题,表示树的指针的个数是不确定的。        

图3.使用链表存储树

        有没有更好的办法呢,答案是有的,我们可以把树转成二叉树来存储。

五、二叉树

1.定义

        二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的互不相交的二叉树组成。

2.二叉树的五种状态

图4.二叉树的五种状态

3.树和二叉树之间的转换

1.树转二叉树

        长子作为左孩子节点,兄弟节点作为右结点。

        方法:加线(兄弟相连)-- 抹线(长兄为父)--旋转

        以图1的树为例。第一步我们把结点的长子作为二叉树的左节点,其余的兄弟结点作为右结点。

        操作之后,树的形状为下图5

图5.长子作为左结点,兄弟结点作为右结点

        然后旋转兄弟结点。旋转之后的二叉树为下图6

图6.树转二叉树

2.二叉树转树

        和上述树转二叉树的顺序相反即可。

六、二叉树的性质

图7.二叉树的第一个性质

图8.二叉树的第二个性质

图9.二叉树的第三个性质

图10.二叉树的第四个性质

图11.二叉树的第五个性质

七、参考资料

数据结构(c语言 第2版 严蔚敏)

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

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

相关文章

vscode中配置 leetcode 插件

1. 环境准备 插件安装介绍 介绍 VS Code 1.23.0 Node.js 10 注意:请确保Node在PATH环境变量中。您也可以通过设定 leetcode.nodePath 选项来指定 Node.js 可执行文件的路径。 1.1 Node.js 安装 首先,您需要解压下载的 .tar.xz 文件。您可以使用以下…

C++反汇编,指针和内存分配细节,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体,占用内存空间,逻辑上独立;引用是别名,与变量共享内存空间,逻辑上不独立。指针定义时可以不初始化;引用定义时必须初始化。指针的…

SpringBoot中使用RocketMQ实现事务消息来保证分布式事务的一致性(有代码)

前言 分布式事务是分布式系统中非常常见的问题。是非常必要钱常见的。实现的方式也是多种多样。今天这个视频主要来分享一下RocketMQ实现事务消息来保证分布式事务的一致性。不知道大家使用过这种方式没有。这种分布式事务的原理其实和本地消息表一样。 本地消息表实现分布式…

电脑中的两个固态硬盘比一个好,想知道为什么吗

你当前的电脑很有可能有一个NVME SSD作为主驱动器,但可能至少还有一个插槽可以放另一个SSD,而且这样做可能是个好主意。 两个SSD可以提高性能 如果你有两个固态硬盘,你可以从中获得比有一个更好的性能。一种方法是使用RAID 0将两个驱动器组…

HR招聘面试,如何测评候选人的执行力和岗位胜任力

执行力是人才测评中的重要组成,尤其是对于小微企业那就更加重要了,几乎每个岗位都需要员工有独挡一面的能力,没有执行力的员工是无法在中小企业生存的,那么对于大型企业来说,是不是执行力不重要?非也&#…

报错(已解决):无法加载文件 D:\code\NodeJs\pnpm.ps1,因为在此系统上禁止运行脚本。

问题: 在vscode运行uniapp项目需要拉取全部依赖,需要使用到pnpm,在vscode终端运行命令:pnpm install后报错: 解决办法: 1:我未安装pnpm,首先打开电脑cmd,运行下列命令&a…

Selenium 自动化 —— 常用的定位器(Locator)

什么是定位器 定位器(Locator)是识别DOM中一个或多个特定元素的方法。 也可以叫选择器 Selenium 通过By类,提供了常见的定位器。具体语法如下: By.xxx("");我们选择单个元素时可以使用findByElement: Web…

JUC下的ForkJoinPool详解

详细介绍 ForkJoinPool 是 Java 并发包 (java.util.concurrent) 中的一个特殊线程池,专为分治算法设计,能够高效地处理大量可分解的并行任务。它基于工作窃取(work-stealing)算法,当一个工作线程的任务队列为空时&…

13 华三三层链路聚和

13 华三三层链路聚和 AI 解析 华三三层静态路由是指在华三交换机上配置的一种路由方式。它通过在交换机上手动配置路由表,将不同网络之间的数据进行转发。 华三三层静态路由的配置步骤如下: 1. 配置交换机接口的IP地址:在交换机上选择要配…

拦截器添加以及注册

自定义拦截器 自定义一个类 实现 HandlerInterceptor 接口 并重写里面的方法 preHandle、postHandle、afterCompletion preHandle:在执行具体的Controller方法之前调用 postHandle:controller执行完毕之后被调用 afterCompletion:方法需要…

NOIP,CSP-J,CSP-S——函数

一、函数概念 /*函数返回类型 函数名(参数){语句 } */ int add(int x,int y){return xy; } 调用这个函数add int main(){int x,y,z;scanf("%d%d",&x,&y);zadd(x,y);printf("%d",z); } …

我从这些书籍中学来的财务以及税务知识

“你不能指望在开始工作的头两年攒下任何积蓄。” 这句话一直是我的座右铭,也是我给大学生的个人理财建议。这也就难怪我二十出头的时候,基本就是靠薪水过日子。 回想起来,我意识到其实这并不是最好的建议,甚至非常不好。 我现…

纹理映射技术在AI去衣应用中的关键作用

引言: 随着人工智能技术的飞速发展,其在图像处理领域中的应用也日益广泛。AI去衣,作为一种颇具争议的技术应用,指的是利用深度学习算法自动移除或替换图片中的衣物。在这一过程中,纹理映射技术扮演了不可或缺的角色。本…

Anaconda安装和深度学习环境的安装(TensorFlow、Pytorch)

换了新电脑,重新装一下anaconda这些编程环境。好久没装过了,自己也需要查查资料,然后记录一下,分享给别人。 目标,三个环境:1.anaconda基础环境(包含xgboost和lightgbm)&#xff0c…

地图位置的二维码怎么做?在线制作地图二维码的方法

怎么定位一个位置做成二维码呢?随着互联网的不断发展,现在通过扫描二维码来获取导航位置的方式有很多的场景都在应用。这种方式的好处在于其他人都可以通过这个二维码来获取位置,有利于分享。 导航地图二维码可以在电脑的二维码生成器上快速…

springboot3项目练习详细步骤(第一部分:用户业务模块)

目录 环境准备 用户模块 注册 注册接口文档 ​编辑 实现结构 Spring Validation 登录 登录的接口文档 实现登录逻辑 JWT令牌 完善登录认证 拦截器 获取用户详细信息 接口文档 Usercontroller类中编写方法接口 忽略属性返回 优化代码ThreadLocal 更新用户基本信…

win11 安装oracle11g详细流程及问题总结

1.安装包下载地址 本案例操作系统, Oracle 11g下载-Oracle 11g 64位/32位下载官方版(附详细的安装图解教程) - 多多软件站多多为大家免费提供Oracle 11g下载,包含64位/32位官方版本,并附详细的Oracle 11g安装图解教程,同时希望能…

全网最详细的Python自动化测试(unittest框架)

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

【AIGC】深入探索AIGC技术在文本生成与音频生成领域的应用

🚀文章标题 🚀AIGC之文本生成🚀应用型文本生成🚀创作型文本生成🚀文本辅助生成🚀重点关注场景 🚀音频及文字—音频生成🚀TTS(Text-to-speech)场景🚀乐曲/歌曲生成&#x…

鸿蒙开发-ArkTS语言-容器-非线性容器

鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…