【数据结构初阶】第七节.树和二叉树的性质

news2024/10/6 12:29:06

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

一、树

1.1 树的概念

1.2 树的结点分类

1.3 结点之间的关系

1.4 树的存储结构

1.5 其他相关概念

 二、 二叉树

2.1 二叉树的概念

2.2 特殊的二叉树

2.3 二叉树的性质

2.4 性质的相关习题

总结



前言

今天我们将进入到树与二叉树的相关内容当中,本节内容讲述了二叉树和树的有关性质和概念;

让我们一起进入到今天的学习当中吧!!!!!!!!!!


一、树

1.1 树的概念

这是现实世界的树

而我们这里所说的树,其实是一种特殊的数据结构 

之前我们学习的不管是顺序表还是链表、队列、栈,都是一对一的线性结构。但在数据生活中还有很多一对多的情况,所有我们就要用到这种一对多的数据结构——树;

树(Tree)是n(n≥0)个结点的有限集。n=0时称为空树。

在任意一颗非空树中

 (1)有且仅有一个特定的称为根(root)的结点
(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集 T 1 , T 2 , . . . , T m ;

其中每一个集合本身又是一棵树,并且称为根的子树;

 有两个点需要注意一下:  

  1. 树是递归定义的——也就是说树的定义之中还用到了树的定义;
  2. 树形结构中,子树之间不能有交集,否则就不是树形结构;

解释一下这两点:

比如这是一个树

 下图的子树T1和T2就是根结点A的子树。当然,D,G,H,I组成的树又是B为结点的子树,E、J、F组成的树是C为结点的树的子树。 

一些非树的例子 :

 注:上面三个就不是树结构,只有右下角的那个称为树型结构;


1.2 树的结点分类

树的结点包含一个数据元素及若干指向其子树的分支;结点拥有的子树数称为结点的度(Degree)

度为0的结点称为叶结点(Leaf)或终端结点度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。

如下图,因为这棵树结点的度的最大值是结点D的度,为3,所以树的度为3.


1.3 结点之间的关系

  1. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  2. 孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;
  3. 兄弟节点:具有相同父节点的节点互称为兄弟节点;

图示说明:

节点的祖先:从根到该节点所经分支上的所有节点。如上图对于结点H来说,D、B、A都是他的祖先;

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:B的子孙有D、G、H、I;


1.4 树的存储结构

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的孩子兄弟表示法

 我们观察后发现,任意一棵树,它的结点的第一个孩子如果存在就是唯一的。因此,我们设置两个结点引用,分别指向该结点的第一个孩子和该结点的右兄弟。 

结点结构如表所示:

代码分析:

 class TreeNode {

        int date;  // 数据域

        TreeNode firstchild;    // 该结点的第一个孩子

        TreeNode rightbrother;  // 该结点的右兄弟

}

那么下面的树:

就可以表示成:

这种表示其实就是把一棵复杂的树变成了一棵二叉树 ;

至于二叉树是什么?这也是咱们接下来要重点聊的内容了; 


1.5 其他相关概念

结点的层次:从一棵树的树根开始,树根所在层为第一层,根的孩子结点所在的层为第二层,依次类推;

树的高度或深度:树中节点的最大层次;

堂兄弟节点:双亲在同一层的节点互为堂兄弟;

堂兄弟节点图示解释:

 森林:由m(m>0)棵互不相交的树的集合称为森林;

有序树和无序树:如果树中结点的子树从左到右看,谁在左边,谁在右边,是有规定的,这棵树称为有序树;反之称为无序树。

(在有序树中,一个结点最左边的子树称为"第一个孩子",最右边的称为"最后一个孩子"。

 二、 二叉树

2.1 二叉树的概念

简单地理解,满足以下两个条件的树就是二叉树:

  1. 本身是有序树;
  2. 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;

例如,图 1a) 就是一棵二叉树,而图 1b) 则不是。

 再深入的理解就是:

一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空;
2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成;

图示举例:

  从上图可以看出:
1. 二叉树不存在度大于2的结点;
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树;

注意:

对于任意的二叉树都是由以下几种情况复合而成的:


2.2 特殊的二叉树

满二叉树:

如果二叉树中除了叶子结点,每个结点的度都为 2;

 完全二叉树 

如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布;

 如图 3a) 所示是一棵完全二叉树,图 3b) 由于最后一层的节点没有按照从左向右分布,因此只能算作是普通的二叉树。 

其实完全二叉树类似这下面这种情况:

 从中我们也可以发现一些规律,如果一个完全二叉树的某一个结点没有右子树,那么该结点一定没有左子树,有右子树就一定得有左子树。它从左到右一定是连续的,中间不能出现空的。 

注意:
一个慢二叉树一定是一棵完全二叉树,但完全二叉树不一定是满二叉树。


2.3 二叉树的性质

性质一:若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点.

解析:

我们来观察下面的图形:


性质2:若规定根节点的层数为1,则深度为k的二叉树的最大结点数是2^k - 1 .(深度为k意思就是有k层的二叉树)

解析:

我们前面已经知道,一棵非空二叉树的第i层上2^(i-1) 个结点,那么k层的二叉树的结点树不就是首项是1、公比是2的等比数列求和吗?


性质3:对任何一棵非空二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为n2 ,则有n0 =n2 +1;

解析:

 对于二叉树来说,我们会发现(除了根节点)对于每一个结点来说,都有其对应父结点分支指向它,假设树中分枝数为 B,那么总的结点数就是B+1;

设总结点数为n,度为0的结点(即叶子结点)个数为n0、度为1的结点个数为n1、度为2的结点个数为n2,那么就有n = n0 + n1 + n2;

同时分支数B = n1 + 2 * n2,B + 1 == n;

所以就有n0 = n2 + 1;


2.4 性质的相关习题

第一题:

解析:

该二叉树的结点数是奇数,而对于结点数是奇数的二叉树,像这样:

你会发现,该二叉树中度为1的结点数一个都没有,这不是偶然,你观察其他的的二叉树,会发现也有这样一个规律。


而对于结点数是偶数的二叉树呢?

你会发现结点数为偶数的二叉树,有且仅有一个度为1的结点;

综上所述:

 那么这样我们就可以开始算了: 设叶子结点即——度为0的结点数为n0,度为1的结点数为n1(n1 == 0),度为2的结点数为n2(n2  = n0 -1);

399 = n0 + n1 + n2 = 2* n0 - 1 --->n0 = 200


第二题:

 解析:

 2n说明结点数是偶数个,度为1的结点个数为1,2n = n0 + n1 + n2 = 1 + n0 + (n0 - 1)

即n0 == n,叶子结点个数为n ;


第三题:

解析:

二叉树的性质: 

非空二叉树的叶子结点等于双分支结点数加1;


第四题:

解析:

 对于这个题目就要用到我们的性质四了;

2^9 == 512,即log2(531 + 1) == 9.xx向上取整即为10,所以答案就是B;

性质四:具有n个结点的完全二叉树的深度k为 log2(n+1)上取整;


性质五:对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:

1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点;
2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子;
3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子;

总结

今天的内容就介绍到这里,下一句我们将继续介绍有关二叉树的编程的有关问题,以及二叉树的常见操作的使用等等;让我们下一期再见吧!!!!!!!!!!

 

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

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

相关文章

快速上线chatGPT软件

ChatGPT是一个由OpenAI开发的自然语言处理模型&#xff0c;您无法将其直接上线。但是&#xff0c;如果您想要在您的应用程序中集成对话系统或聊天机器人&#xff0c;您可以探索以下步骤&#xff1a; 选择开发工具&#xff1a;选择一个适合您的编程语言和平台的开发工具&…

C++ [STL之string的使用]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT 文章目录 前言正文编码basic_string类说明basic_string实例成员关于string string类模块构造函数空间大小相关字符串长度及容量大小清空字符串和空串查询字符串大小和容量设置 访问与遍历头尾元…

探索【Stable-Diffusion WEBUI】的插件:界面与中文翻译

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;主题&#xff08;kitchen Theme&#xff09;&#xff08;二&#xff09;对照翻译&#xff08;Bilingual Localization&#xff09;&#xff08;三&#xff09;自行翻译&#xff08;四&#xff09;提示词翻译…

前端02:CSS选择器等基础知识

CSS基础选择器、设置字体样式、文本样式、CSS的三种引入方式、能使用Chrome调试工具调试样式 HTML专注做结构呈现&#xff0c;样式交给CSS&#xff0c;即结构&#xff08;HTML&#xff09;和样式CSS相分离 CSS主要由量分布构成&#xff0c;选择器以及一条或多条声明 选择器&…

华为OD机试真题(Java),喊7的次数重排(100%通过+复盘思路)

一、题目描述 喊7是一个传统的聚会游戏&#xff0c;N个人围成一圈&#xff0c;按顺时针从1到N编号。 编号为1的人从1开始喊数&#xff0c;下一个人喊的数字为上一个人的数字加1&#xff0c;但是当将要喊出来的数字是7的倍数或者数字本身含有7的话&#xff0c;不能把这个数字直…

ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例

ML之DR&#xff1a;基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 目录 基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 # 1、定义数据集 # 2、数…

华为OD机试真题(Java),密码验证合格程序(100%通过+复盘思路)

一、题目描述 密码要求: 长度超过8位包括大小写字母.数字.其它符号,以上四种至少三种不能有长度大于2的包含公共元素的子串重复 &#xff08;注&#xff1a;其他符号不含空格或换行&#xff09; 二、输入描述 一组字符串。 三、输出描述 如果符合要求输出&#xff1a;OK&…

Oxygen Content Fusion carck

Oxygen Content Fusion carck 输入法支持改进-对非拉丁语言输入法编辑器(IME)的支持在稳定性和性能方面得到了改进。 文件比较工具中环绕差异的精确显示-文件比较工具现在可以更好地识别和显示环绕编辑产生的差异。例如&#xff0c;当一段文本标记有标记时&#xff0c;它会识别…

pytorch深度学习框架CUDA版本环境安装记录——牛刀杀鸡——解一个非线性方程组

目录 一、前言二、安装步骤step1. 安装显卡驱动step2. 安装cudastep3. 安装cuDNNstep4. 安装pytorch环境 三、用pytorch解个非线性方程组 一、前言 在深度学习界pytorch框架用得人越来越多&#xff0c;无论是CV机器视觉、NLP还是自然语言处理&#xff0c;目前主流的大的模型如…

Matlab-报错griddedInterpolant解决方法分享

Yiinterp1 (x,Y,xi) interp1函数的用法&#xff1a; yiinterp1 (x,Y,xi)&#xff1a;返回插值向量yi&#xff0c;每一元素对应于参量xi&#xff0c;同时由向量X与Y的内插值决定。 1.问题产生 用matlab做网格数据插值时遇到的问题 报错截图收录 2.分析原因 根据报错可知&#x…

胜叔说SI_PI_EMC

第一课 分享的目的 书籍推荐 第二课 什么是理论分析 仿真不是目的&#xff0c;仿真是验证理论分析的方法 测试不是目的&#xff0c;测试是验证理论分析的方法 第三课 信号完整性简介 小型化、高功率、高密度 传输线理论&#xff1a;传输线是由 信号路径和返回路径共同组…

【Spring Cloud】Sleuth+Zipkin全链路日志追踪接入实战

文章目录 一、背景链路追踪介绍为什么需要链路追踪?那该如何解决呢&#xff1f; 二、常见的链路追踪技术有下面这些&#xff1a;三、Sleuth3.1、Sleuth&#xff08;读作/sluːθ/&#xff09;介绍3.2、相关术语3.3、Sleuth入门 四、多线程传递traceId1.问题2.解决方案3. 业务组…

cookie和session—javaEE

1.cookie 1.1定义 单纯的说cookie指的是cookie技术&#xff0c;是客户端保存数据的一种技术 1.2保存的方式 &#xff08;1&#xff09;客户端写js代码 &#xff08;2&#xff09;服务端返回响应头set-cookie字段的值让客户端保存在本地硬盘或浏览器的相关路径中 1.3作用 …

Oracle的学习心得和知识总结(二十三)|Oracle数据库Real Application Testing之Database Replay相关视图

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

[C++]模板初阶与STL简介

目录 模板初阶与STL简介&#xff1a;&#xff1a; 1.泛型编程 2.函数模板 3.类模板 4.什么是STL 5.STL的版本 6.STL的六大组件 7.STL的缺陷 模板初阶与STL简介&#xff1a;&#xff1a; 1.泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left, int& righ…

《Netty》从零开始学netty源码(四十二)之PoolChunk.runsAvailMap

runsAvailMap PoolChunk中的runsAvailMap属性用于存放可用的run的信息&#xff0c;PoolChunk中每一次分配内存都会更新runsAvailMap中可用的run的起始信息及末尾信息&#xff0c;先看下它的数据结构&#xff1a; 我们看下它的构造函数是如何赋值的&#xff1a; PoolChunk的默认…

为什么MySQL索引更适合B+树而不是二叉树、B树

概述&#xff1a; 在当今社会&#xff0c;程序员内卷非常的严重&#xff0c;如果没有过硬的技术&#xff0c;很难在众多的程序员中脱颖而出&#xff0c;例如&#xff0c;以前问数据库方面的知识&#xff0c;只会问些增删改查语句表面的东西&#xff0c;而如今却要问数据库底层…

【翻译一下官方文档】之uniapp的网络请求

uni.request(OBJECT) 发起网络请求。 参数名类型必填默认值说明平台差异说明urlString是开发者服务器接口地址dataObject/String/ArrayBuffer否请求的参数App 3.3.7 以下不支持 ArrayBuffer 类型headerObject否设置请求的 header&#xff0c;header 中不能设置 RefererApp、H5…

关于链表的题目—leetcode

第一题&#xff1a;删除链表中的指定节点 问题描述&#xff1a; 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。 返回删除后的链表的头节点。 示例 1: 输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点…

【redis】缓存预热雪崩穿透击穿

【redis】缓存预热雪崩穿透击穿&#xff08;上&#xff09; 文章目录 【redis】缓存预热雪崩穿透击穿&#xff08;上&#xff09;前言一、面试题二、缓存预热三、缓存雪崩发生原因预防&#xff0b;解决高可用&#xff1a;多缓存结合&#xff1a; 人民币玩家 四、缓存穿透是什么…