初识树型结构与二叉树

1. 树型结构

        树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树(它是根朝上,而叶朝下的),其物理结构如下图所示:

                             

        其中树形结构具有以下的特点:

        1、有一个特殊的结点,称为根结点,根结点没有前驱结点

        2、除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti (1 <= i <= m) 又是一棵与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继(除了根节点之外,其余的节点有且仅只有一个父节点

        3、树是递归定义的

        4、树形结构中,子树之间不能有交集,否则就不是树形结构  

        5、一个有n个节点的树,它有n-1条边;

1.1 关于树的关键词

        下面的一些列重要关键词汇的介绍是针对下图树来讲解的:

           

一级词汇(重点理解):

1、结点的度(节点的分支一个结点含有子树的个数称为该结点的度; 如上图:A的度为6 

2、树的度(分支最多的那个节点的分支数:一棵树中,所有结点度的最大值称为树的度; 如上图:树的度为6

3、叶子结点或终端结点(没有分支的节点:度为0的结点称为叶结点; 如上图:B、C、H、I...等节点为叶结点

4、双亲结点或父结点有分支的节点):若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点

5、孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点

6、根结点(最顶头的节点:一棵树中,没有双亲结点的结点;如上图:A

7、结点的层次从上到下数,该节点在第几行):从根开始定义起,根为第1层,根的子结点为第2层,以此类推

二级词汇(了解即可)

1、非终端结点或分支结点:度不为0的结点; 如上图:D、E、F、G...等节点为分支结点

2、兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点

3、兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点

4、堂兄弟结点 :双亲在同一层的结点互为堂兄弟;如上图: H 、 I 互为兄弟结点
5、结点的祖先 :从根到该结点所经分支上的所有结点;如上图: A 是所有结点的祖先
6、子孙 :以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是 A 的子孙
7、森林 :由 m ( m>=0 )棵互不相交的树组成的集合称为森林

1.2 树的表示形式  

        树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦,实际中树有很多种表示方式,如:双亲表示法, 孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。

        这里通过代码简单的了解其中最常用的孩子兄弟表示法;

class Node {
int value; // 树中存储的数据
Node firstChild; // 第一个孩子引用
Node nextBrother; // 下一个兄弟引用
}

        下图是孩子兄弟表示法的树结构图解:

        如上图所示,孩子兄弟表示法主要通过child域(存放该节点的子节点的地址)和brother域(存放该节点兄弟节点的地址)来完成整个树构成;

2. 二叉树

        一棵二叉树是关于结点的一个有限集合,该集合的特点:

        1. 或者为空

        2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

                       

        如上图就是将一个二叉树分解成概念中的节点的有限集合的形式(左子树<--根节点-->右子树),从上图可以看出:

        1. 二叉树不中结点的分支最多就是2个分支;

        2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2.1 特殊的二叉树 

        1. 满二叉树(除了叶子节点,其余的节点都有两个分支) : 一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树 。也就是说,如果一棵二叉树的层数为 K,且结点总数是(2^K)-1 ,则它就是满二叉树 ,如下图就是满二叉树;

                                 
        2. 完全二叉树 : 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于所有的节点按照二叉树的规则,依据从上到下,从左到右,依次排序的准则排序的二叉树, 要注意的是满二叉树是一种特殊的完全二叉树,如下图就是完全二叉树;

                            

2.2 二叉树的性质

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

        //已知第几层------> 计算该层节点个数

2. 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是(2^K)-1 (k>=0)

3. 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1

推导过程如下所示:

4. 具有n个结点的完全二叉树的深度k为 上取整

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

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

5.1重要的两个小结论:

3.二叉树例题讲解

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )

A 不存在这样的二叉树

B 200

C 198

D 199

        由性质3可得: 对任何一棵二叉树 , 如果其叶结点个数为 n0, 度为 2 的非叶结点个数为 n2, 则有n0=n2+1------->399=n0+n2-------->399=n0+n0-1----->n0=200

或者---->
                n0=199+1为200;------>B

 2.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )

A n

B n+1

C n-1

D n/2

        考虑是否存在最后一个节点只有一个分支的节点,图解如下图所示:

 由n0 = n2 +1可得:

左图:2n = n0 + 1 +n0-1------------->n0 = n---------->A;

右图:2n = n0 +n0-1------------------->n0=(2n+1)/2;

 3.一个具有767个节点的完全二叉树,其叶子节点个数为()

A 383

B 384

C 385

D 386

由n=n0+n1+n0-1--------->768=2n0+n1------>因为n1只能为1------>不满足题意,令n1 =0----->n0=768/2 =384; 

 4.一棵完全二叉树的节点数为531个,那么这棵树的高度为( )

A 11

B 10

C 8

D 12

 

性质4:具有n个结点的完全二叉树的深度k为: 

注意:向上取整

512=2^9<2^10;

故令h =10;

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

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

相关文章

Ubuntu 20.04 安装 mysql8 LTS

Ubuntu 20.04 安装 mysql8 LTS sudo apt-get update sudo apt-get install mysql-server mysql --version mysql Ver 8.0.35-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu)) Ubuntu20.04 是自带了 MySQL8. 几版本的&#xff0c;低于 20.04 则默认安装是 MySQL5.7.33 s…

rpm安装gitlab

1.rpm包下载 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 2.进行安装 rpm -ivh gitlab-ce-15.9.7-ce.0.el7.x86_64.rpm --nodeps --force 3.配置访问地址 vim /etc/gitlab/gitlab.rb 4.重新加载配置以及重启服务 gitlab-ctl reconfiguregitlab-ctl resta…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(2)》(26)

《Linux操作系统原理分析之Linux文件管理&#xff08;2&#xff09;》&#xff08;26&#xff09; 8 Linux文件管理8.4 虚拟文件系统 VFS8.4.1 VFS 的工作原理8.4.2 VFS 超级块8.4.3VFS 的 inode 8.5 文件系统的安装与注册8.5.2 文件系统的注册 8 Linux文件管理 8.4 虚拟文件系…

HarmonyOS4.0从零开始的开发教程05 应用程序入口—UIAbility的使用

HarmonyOS&#xff08;三&#xff09;应用程序入口—UIAbility的使用 UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 每一个UIAbility实例&#xff0c;…

python数据分析基础

前言 2023年10月以来&#xff0c;一位在商学院就读的可爱同学遇上了一门课——python数据分析&#xff0c;并遇到了许多问题&#xff0c;找上了我&#xff0c;就此&#xff0c;我也开始了学习之路&#xff0c;虽然很浅显&#xff0c;但这些东西对部门同学来说也是受用的&#…

【XILINX】ISE chipscope出现错误 Can‘t load jre bin client jvm.dll

记录一个ISE软件使用过程中遇到的问题及解决方案。 问题 ISE chipscope出现错误 Cant load jre bin client jvm.dll C:\Xilinx\14.7\ISE_DS\ISE\bin\nt C:\Xilinx\14.7\ISE_DS\.xinstall\bin\nt C:\Xilinx\14.7\ISE_DS\.xinstall\bin\nt64 C:\Xilinx\14.7\ISE_DS\ISE\bin\nt6…

Weblogic CVE-2023-21839(metasploit版)

Step1&#xff1a;用docker搭建环境 Step2&#xff1a;docker查看映射端口 Step3&#xff1a;访问特定端口&#xff0c;然后靶标应用。 Step4&#xff1a;用metasploit进行攻击&#xff1a; 首先&#xff0c;打开metasploit&#xff0c;然后查询需要攻击的板块&#xff0…

【恶意刷券】电商中恶意刷券如何防止?

好的&#xff0c;更详细一些的解释如下&#xff1a; 1. **验证码验证** 验证码验证是防范恶意刷券的最基本手段之一。通过在关键操作前引入验证码&#xff0c;可以让机器无法进行自动化操作&#xff0c;只有真实用户才能完成验证。验证码种类包括文字、图片、计算等多种形式&…

C# 未处理System.InvalidOperationException HResult=-2146233079

1.异常信息&#xff1a; 未处理System.InvalidOperationException HResult-2146233079 MessageThe custom trace listener custom listener does not have a listener type name set or the type is invalid (F:\CBCT64\Output\Polaris.exe.Config line 45). SourceMicr…

[实践总结] 使用Apache HttpClient 4.x进行进行一次Http请求

使用Apache HttpClient 4.x进行进行一次Http请求 依赖 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactI…

相位解包裹算法的研究现状和存在的问题

位相解包裹算法的研究现状 Phase unwrapping中文译法有&#xff1a;位相展开&#xff0c;位相解包寝&#xff0c;位相解缠绕等。因为数字全总术的重要步骤就是进行位相解包裹&#xff0c;所以伴随着数字全息显微术的发展&#xff0c;就对位相解包裹算法提出了更高的要求&#x…

华为OD机试 - 机场航班调度程序(Java JS Python C)

题目描述 XX市机场停放了多架飞机,每架飞机都有自己的航班号CA3385,CZ6678,SC6508等,航班号的前2个大写字母(或数字)代表航空公司的缩写,后面4个数字代表航班信息。 但是XX市机场只有一条起飞跑道,调度人员需要安排目前停留在机场的航班有序起飞。 为保障航班的有序…

Python:核心知识点整理大全4-笔记

目录 2.6 Python 之禅 2.7 小结 3.1 列表是什么 3.1.1 访问列表元素 3.1.2 索引从 0 而不是 1 开始 3.1.3 使用列表中的各个值 3.2 修改、添加和删除元素 3.2.1 修改列表元素 3.2.2 在列表中添加元素 2. 在列表中插入元素 1. 使用del语句删除元素 1 处的代码使用del…

指定分隔符对字符串进行分割 numpy.char.split()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定分隔符对字符串进行分割 numpy.char.split() 选择题 请问下列程序运行的的结果是&#xff1a; import numpy as np print("【执行】np.char.split(I.Love.China, sep .)") p…

【Flink on k8s】- 11 - 使用 Flink kubernetes operator 运行 Flink 作业

目录 1、创建本地镜像库 1.1 拉取私人仓库镜像 1.2 运行 1.3 本地浏览器访问 5000 端口

Linux进程解析(冯诺依曼体系结构,操作系统,进程初步解析)

冯诺依曼体系结构&#xff1a; 我们常见的计算机&#xff0c;如笔记本。我们常见的计算机&#xff0c;服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成&#xff1a; 中央处理器(CPU)&am…

Linux socket编程(12):Unix套接字之socketpair、sendmsg和recvmsg详解

在上一篇文章Unix套接字编程及通信例子中&#xff0c;我们对Unix套接字编程有一个基本的了解。但在Unix套接字编程的领域中&#xff0c;有一组特殊而强大的工具&#xff1a;socketpair、sendmsg 和 recvmsg&#xff0c;它们为实现本地进程间通信提供了便捷的方式。 文章目录 1 …

Pandas 打开有密码的Excel

安装包 pip isntall msoffcrypto-tool msoffcrypto库的简单介绍 msoffcrypto提供了对Microsoft Office文件进行加密和解密的功能。它支持对Word、Excel和PowerPoint文件进行加密和解密操作。 msoffcrypto的原理是利用Microsoft Office文件的加密算法对文件进行加密和解密。它能…

绝地求生:NH究极天命圈惊险吃鸡,17斩获单日积分第一,4AM梦游暂居倒数

绝地求生PGC小组赛B组第一轮的比赛即将结束&#xff0c;在刚刚那场决赛圈中NH和17给我们上演了非常精彩的较量&#xff0c;双方战至最后一人&#xff0c;最终由NH击败17收获一鸡&#xff0c;这两支PCL老牌强队总分都超过了40分&#xff0c;晋级胜者组对他们来说压力不大了。新队…

【FPGA图像处理实战】- FPGA图像处理仿真测试工程(读写BMP图片)

FPGA开发过程中“行为功能仿真”是非常必要的一个过程&#xff0c;如果仿真都没通过&#xff0c;则上板测试必定失败。 FPGA图像处理需要读写大量的图像数据&#xff0c;单看这些图像数据实际是没有规则的&#xff0c;如果直接上板测试&#xff0c;调试起来非常困难&#xff0…