快码住!!! 二叉树概念、重要性质、存储结构 技巧大总结!

news2024/11/19 2:36:08

文章目录

    • 树的概念
    • 树的表示
    • 树在实际中的应用
  • 二叉树
    • 二叉树的概念
    • 特殊的二叉树
  • 二叉树的性质
    • 二叉树性质应用的练习题
  • 二叉树的存储结构
    • 顺序结构
    • 链式结构

树的概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成的一个具有层次关系的集合。把它叫做“树”,是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。
在这里插入图片描述
树的特点:

有一个特殊的结点,称为根结点,根结点没有前驱结点。
 除根结点外,其余结点被分成M(M>0)互不相交的集合T1,T2…Tm,其中每一个集合Ti(1<=i<=m)又是一颗结构与树类似的子树。
 每棵子树的根结点有且仅有一个前驱,可以有0个或多个后继。
 因此,树是递归定义的。

树中的专有名词:

结点的度:一个结点含有的子树的个数称为该结点的度。
 叶结点(终端结点):度为0的结点称为叶结点。
 非终端结点(分支结点):度不为0的结点。
 父结点(双亲结点):若一个结点含有子结点,则这个结点称为其子结点的父结点。
 子结点(孩子结点):一个结点含有的子树的根结点称为该结点的子结点。
 兄弟结点:具有相同父结点的结点互称为兄弟结点。
 树的度:一棵树中,最大的结点的度称为树的度。
 结点的层次:从根开始定义起,根为第一层,根的子结点为第二层,以此类推。
 树的高度(树的深度):树中结点的最大层次。
 堂兄弟结点:双亲在同一层的结点互称为堂兄弟结点。
 结点的祖先:从根到该结点所经分支上的所有结点。
 子孙:以某结点为根的子树中任一结点都称为该结点的子孙。
 森林:由m(m>0)棵互不相交的树组成的集合称为森林。

在这里插入图片描述

树的表示

树结构相对于线性表就比较复杂了,要存储和表示起来就比较麻烦了,实际中树有很多种表示方法。如:双亲表示法、孩子表示法、孩子兄弟表示法等等。其中最常用的是孩子兄弟表示法。
 孩子兄弟表示法中,所定义的结点类型大致是这样的:

typedef int DataType

struct Node
{
	struct Node* firstChild;   //第一个孩子结点
	struct Node* nextBrother;  //指向下一个兄弟结点
	DataType data;             //结点中的数据域
};

对于任意树,我们都可以用孩子兄弟法访问到树中的每一个结点:
在这里插入图片描述

树在实际中的应用

表示文件系统的目录树结构:
在这里插入图片描述

二叉树

二叉树的概念

二叉树是n个结点的有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。

二叉树的特点:
 每个结点最多有两个棵子树,即二叉树不存在度大于2的结点。
 二叉树的子树有左右之分,其子树的次序不能颠倒。

自然界中的二叉树:
在这里插入图片描述
数据结构中的二叉树:
在这里插入图片描述

特殊的二叉树

**满二叉树:**一个二叉树,如果每一层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为k,且结点总数是2k-1,则它就是满二叉树。

**完全二叉树:**完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K,有N个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至N的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。
在这里插入图片描述
总结:

满二叉树:若树的深度为K,那么它的每一层的结点数必须都是满的。
 完全二叉树:若数的深度为K,那么它的前K-1层的结点数必须都是满的,第K层的结点数可以不是满的但是从左到右必须是连续的。

二叉树的性质

**性质一:**若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2i-1个结点。
 **性质二:**若规定根结点的层数为1,则深度为h的二叉树的最大结点数为2h-1个。
 **性质三:**对任何一棵二叉树,如果度为0的叶结点个数为n0,度为2的分支结点个数为n2,则有n0 = n2+1。
 **性质四:**若规定根结点的层数为1,则具有N个结点的满二叉树的深度h = log2(N+1)。
 **性质五:**对于具有N个结点的完全二叉树,如果按照从上至下、从左至右的数组顺序对所有结点从0开始编号,则对于序号为i的结点:
 若 i > 0,则该结点的父结点序号为:( i - 1) / 2;若 i = 0,则无父结点。
 若2i + 1 < N,则该结点的左孩子序号为:2i + 1;若2i + 1 >= N,则无左孩子。
 若2i + 2 < N,则该结点的右孩子序号为:2i + 2;若2i + 2 >= N,则无右孩子。
在这里插入图片描述

二叉树性质应用的练习题

1.某二叉树共有399个结点,其中199个度为2的结点,则该二叉树中的叶子结点数为( )。
 A.不存在这样的二叉树
 B.200
 C.198
 D.199

2.在具有2n个结点的完全二叉树中叶子结点个数为( )。
 A.n
 B.n+1
 C.n-1
 D.n/2

3.一棵完全二叉树的结点数为531,那么这棵树的高度为( )。
 A.11
 B.10
 C.8
 D.12

4.一个具有767个结点的完全二叉树,其叶子结点个数为( )。
 A.383
 B.384
 C.385
 D.386

解析:
 1.(答案:B)根据性质三,叶子结点(度为0)的个数200个,由于199+200 = 399(该二叉树的总结点数),所以该二叉树的叶子结点数为200。

2.(答案:A)根据性质三,度为0的结点数和度为2的结点数之和应为奇数,因为该完全二叉树的结点总数为2n(偶数),所以二叉树中必然存在一个度为1的结点。于是可以推出:度为0的结点和度为2的结点总共有2n-1个。性质三:对任何一棵二叉树,度为0的叶结点个数比度为2的分支结点个数多1,所以该二叉树度为1的结点个数为n-1,度为0的结点数(即叶结点数)为n。

 **注意理解:**任何一棵完全二叉树中度为1的结点要么有1个,要么就没有度为1的结点。因为完全二叉树的最后一层的结点必须是从左到右连续的,而位于最后一层之前的层数的结点的度均为2。

在这里插入图片描述

3.(答案:B)假设该完全二叉树的层数为K,则该完全二叉树的前K-1层的结点总数为2K-1-1,若该完全二叉树是满二叉树,则该满二叉树的结点总数为2K-1,所以深度为K的完全二叉树的结点总数范围为:2K-1-1 < N <= 2K-1。因为29 < 531 <= 210,所以该完全二叉树的高度为10。

**注意记忆:**210 = 1024。

4.(答案:B)该题与第2题的道理是一样的,因为该树的结点总数为767(奇数),所以该树中不存在度为1的结点,度为2的结点个数为383,度为0的结点个数为384,即叶子结点个数为384。

二叉树的存储结构

顺序结构

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实生活中只有堆(一种二叉树)才会使用数组来存储。二叉树的顺序存储在物理上是一个数组,在逻辑上是一棵二叉树。
在这里插入图片描述

链式结构

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素之间的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来存储该结点左孩子和右孩子所在的结点的地址。
 链式结构又分为二叉链和三叉链,之后我们会用二叉链来实现二叉树的链式存储结构,三叉链运用于更高阶的数据结构,例如红黑树。
在这里插入图片描述

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

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

相关文章

语言模型及Word2vec与Bert简析

语言模型可以对一段文本的合理性概率进行估计&#xff0c;对信息检索&#xff0c;机器翻译&#xff0c;语音识别等任务有着重要的作用。就以前的学习笔记&#xff0c;本文简单总结了NLP语言模型word2vec和bert分享给大家&#xff0c;疏漏之处&#xff0c;望请指出&#xff0c; …

Go语言的简介和环境搭建

Go语言的简介和环境搭建 带你了解什么是Go语言 如何安装和配置Go的开发环境 静态强类型&#xff0c;编译型语言&#xff01;&#xff01;&#xff01; 1.简介 1.1介绍 Go 也称为 Golang&#xff0c;两个是一个东西。谷歌弄得。创造者都是大佬&#xff0c;所以说这个编程语言很…

PSP - AlphaFold2 Multimer 的 Heteromer (异聚体) MSA 逻辑

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130733737 同源多聚体 (Homomer) 是由相同的蛋白质亚基组成的,而异源多聚体 (Heteromer) 是由不同的蛋白质亚基组成的。同源多聚体的亚基之间通常有对称的相…

BFT 最前线 | OpenAI开放网络浏览和插件;“360AI商店”上线;Bing市场份额不升反降;亚马逊机器人配送中心投产

原创 | BFT机器人 AI视界 TECHNOLOGY NEWS 01 OpenAI将向所有ChatGPT Plus用户推出网络浏览和插件 OpenAI将向所有ChatGPT Plus用户推出网络浏览和插件近日&#xff0c;OpenAI发文称&#xff0c;将在本周&#xff08;5.15-5.21日&#xff09;内向所有ChatGPT Plus用户推出网络…

【Python scikit-learn】零基础也能轻松掌握的学习路线与参考资料

Python是一种广泛使用的编程语言&#xff0c;随着数据科学领域的不断发展&#xff0c;Python成为了数据科学的主要工具之一。scikit-learn是Python中一款非常流行的机器学习库&#xff0c;它为广大科学家和工程师提供了一种简单而有效的方法来解决机器学习问题。 本文将从以下…

客服软件强攻略——改善客户自助服务

客户自助服务相对容易采用并集成到您现有的客户服务产品中。也就是说&#xff0c;任何自助服务计划都应该经过充分研究&#xff0c;跟踪明确的目标和成功指标&#xff0c;以确保其成功。 有效的自助服务通常可以通过软件工具形成&#xff0c;比如SaleSmartly&#xff08;ss客服…

微服务保护(线程隔离、降级、熔断)

线程隔离 线程隔离有两种方式实现: 线程池隔离信号量隔离 线程池隔离 假设服务A依赖于服务B和服务C&#xff0c;那么服务A就会分别对服务B和服务C创建线程池&#xff0c;当有请求进来时不会使用服务A本身的线程&#xff0c;而是到对应的线程池中取一个线程来调用feign的客户…

ViLT论文精读笔记

ViLT论文精读笔记 0.摘要1.引言2.背景知识&#xff08;小综述&#xff09;2.1对VLP模型分类2.2模态的融合2.3融合前特征的抽取 3.模型方法3.1预训练目标函数&#xff1a;3.1.1 Image Text Matching&#xff1a;3.1.2 Masked Language Modeling3.1.3 Masked Image Modeling 3.2W…

本周刷题记录

截至周三刷了六道题 题目1&#xff1a; 这是个交互题&#xff0c;目前遇到的交互题都是用二分解决的。 本题使用二分精准定位拥有重量为2的石头的堆。 为避免时间超限&#xff0c;应该再输入数据时计算好前缀和。 二分过程中&#xff0c;如果哪边的重量总和不等于石头数&…

关键词采集软件-关键词自动生成器

网站关键词对于SEO优化至关重要&#xff0c;在搜索引擎排名和流量中扮演着重要的角色。而147seo关键词生成软件可以帮助用户更好地发现与他们的业务和目标相关的关键词和话题。其中的147SEO关键词挖掘软件是其核心功能之一&#xff0c;能够自动批量实时挖掘关键词和短语&#x…

day33_css

今日内容 零、 复习昨日 一、CSS 零、 复习昨日 见代码 一 、引言 1.1CSS概念 ​ 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文…

以转账案例说明Spring事务

文章目录 1 Spring事务简介1.1 相关概念介绍1.2 转账案例-需求分析1.3 转账案例-环境搭建步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步骤7:创建JdbcConfig配置类步骤8:创建…

Istio零信任安全架构设计

主要分为几个模块 安装安全概念整体安全架构源码 1.安装istio (windows环境) windows安装Rancher的步骤 : https://docs.rancherdesktop.io/getting-started/installation, docker desktop开始面向中大型企业收费: https://baijiahao.baidu.com/s?id1709665495660071676&…

CVE-2022-39197(Cobalt Strike XSS <=4.7)漏洞复现(超详细)

0x00 漏洞概述 2022年09月22日&#xff0c;360CERT监测发现了Cobalt Strike远程代码执行漏洞&#xff0c;漏洞编号为CVE-2022-39197&#xff0c;漏洞等级&#xff1a;严重&#xff0c;漏洞评分&#xff1a;9.8   Cobalt Strike&#xff08;也称CS&#xff09;由美国Red Team开…

互联网内卷严重?你咋不看看其他行业呢?无非是三十晚上无月亮,大家都一样

一千个人眼中有一千个哈姆雷特&#xff0c;互联网行业就像一座围城&#xff0c;城外的人想进来&#xff0c;城内的人要么卷要么躺要么润 ​ 真实的感受你可以现在约几个面试体验一下。内卷到什么程度&#xff1f; 产品和运营岗&#xff0c;业务经验不完全对口简历都过不了&am…

洛谷P1036题解

一、问题引出 [NOIP2002 普及组] 选数 题目描述 已知 n n n 个整数 x 1 , x 2 , ⋯ , x n x_1,x_2,\cdots,x_n x1​,x2​,⋯,xn​&#xff0c;以及 1 1 1 个整数 k k k&#xff08; k < n k<n k<n&#xff09;。从 n n n 个整数中任选 k k k 个整数相加&…

nginx keepalive 高可用原理和实操

文章目录 前言一、nginxkeepalive搭建高可用服务方案&#xff1f;二、方案解析1.keepalive是什么2.nginx是什么 三、keepalive与nginx环境安装四、高可用配置实例总结 前言 一、nginxkeepalive搭建高可用服务方案&#xff1f; 使用nginx-keepalived双机热备机制&#xff0c;vi…

Java-锁相关

线程不安全的原因 1.调度器随机调度,抢占式执行(无能为力) 举个例子 有一个int变量 叫count 就俩线程同时count一万次 结果应该为两万 可多次运行程序 这结果每次都不一样(而且小于2w) 是为什么呢 因为count这行代码是分三步运行的 load 把数据读到cpu add 在cpu寄存器实现加法…

一、计算机系统基础

// 本章节内容根据下列代码的生命周期来讲解计算机系统的各个部分 hello.c #include <stdio.h>int main {printf("hello, world\n");return 0; }文章目录 1.1信息 位 上下文1.2程序的编译过程1.3系统的硬件组成1.4运行hello程序1.5高速缓存1.6操作系统管理硬…

小程序用什么开发?

近年来&#xff0c;随着智能手机的普及和移动互联网的发展&#xff0c;小程序成为了一种备受关注的新型应用。那么&#xff0c;小程序用什么开发呢&#xff1f; 首先&#xff0c;小程序可以使用多种技术进行开发&#xff0c;其中比较流行的有两种方式&#xff1a;一种是借助微…