二叉树一定是完全二叉树

news2024/12/25 9:03:47

一、树的概念及其结构

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

1、树的特点

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

注意:树形结构中,子树之间不能有交集,否则就不是树形结构

2、树的相关概念:

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

3、树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的左孩子右兄弟法表示。

typedef int DataType;//重新定义方便以后修改要存储的数据
struct Node
{
 struct Node* firstChild1; // 第一个孩子结点
 struct Node* pNextBrother; // 指向其下一个兄弟结点
 DataType data; // 结点中的数据域
};

复制

树在我们实际生活中,可以类比电脑中的文件目录,一个文件夹中包含众多的文件夹,每个文件夹又包含许多文件

例如:

二、二叉树的概念及其结构

1、二叉树的概念

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

2、二叉树的特点

1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

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

三、特殊的二叉树

1、满二叉树

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

2、完全二叉树

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

说的简单点: 满二叉树 ①所有叶子节点都在最后一层 ②所有分支节点都有两个孩子 完全二叉树 ①前n-1层为满的 ②最后一层不满,但最后一层从左往右是连续的

四、 二叉树的性质(很重要,常用)

①若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2i-1个结点。 ②若规定根结点的层数为1,则深度为h的二叉树的最大结点数为2h-1个。 ③对任何一棵二叉树,如果度为0的叶结点个数为n0,度为2的分支结点个数为n2,则有n0 = n2+1。(常用这个性质解选择题) ④若规定根结点的层数为1,则具有N个结点的满二叉树的深度h = log2(N+1)。 ⑤对于具有N个结点的完全二叉树,如果按照从上至下、从左至右的数组顺序对所有结点从0开始编号,则对于序号为i的结点: 1、若 i > 0,则该结点的父结点序号为:( i – 1) / 2;若 i = 0,则无父结点。 2、若2i + 1 < N,则该结点的左孩子序号为:2i + 1;若2i + 1 >= N,则无左孩子。 3、若2i + 2 < N,则该结点的右孩子序号为:2i + 2;若2i + 2 >= N,则无右孩子。

两道小例题

1.在具有 2n 个结点的完全二叉树中,叶子结点个数为( ) A n B n+1 C n-1 D n/2 2.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( ) A 11 B 10 C 8 D 12

解析:

五、二叉树的存储结构

二叉树一般有两种结构存储,一种顺序结构,一种链式结构

1. 顺序存储(数组) 顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。 2. 链式存储(链表) 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链

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

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

相关文章

ARM Coresight 及 DS-5 介绍 5 - ARM Cortex-M DS-5 加载 ELF 文件运行

文章目录 1.1.1 DS-5 工程创建1.1.2 DS-5 加载 ELF 脚本创建1.1.3 DS-5 脚本读写 Memory1.1.4 DS-5 扫描脚本 1.1.1 DS-5 工程创建 在使用ARM DS-5 连接 board(或者PFGA)之前首先需要能够扫描到相应的硬件信息&#xff0c;比如对应的cpu的相关信息&#xff1a;coresight 相关组…

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 - cpolar内网穿透

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转载自远程内网穿透的文章&#xff1a;【Zblog建站】搭建属于自己的博客网站&#…

【C++】初始化列表,explicit 关键字,静态成员

初始化列表 构造函数内可以对于成员的赋值&#xff0c;故不能称为是初始化&#xff0c;初始化只能初始化依次&#xff0c;C中类对象的初始化可由初始化列表完成 内置类型成员可以通过设置缺省值实现初始化&#xff0c;但对于const修饰的成员、引用成员、没有默认构造函数的自…

hive解析json

目录 一、背景 二、hive 解析 json 数据函数 1、get_json_object 2、json_tuple 3、使用嵌套子查询(exploderegexp_replacesplitjson_tuple)解析json数组 4、使用 lateral view 解析json数组 一、背景 我们进行ETL(Extract-Transfer-Load) 过程中,经常会遇到从不同数据…

编码拓展:链接库

一.认识链接库 1.1库 计算机中&#xff0c;有些文件专门用于存储可以重复使用的代码块&#xff0c;例如功能实用的函数或者类&#xff0c;我们通常将它们称为库文件&#xff0c;简称“库”&#xff08;Library&#xff09;。 以 C 语言为例&#xff0c;如下为大家展示的就是…

JUC高级十-并发加锁原理之AbstractQueuedSynchronizer(AQS)

1. 前置知识 公平锁和非公平锁可重入锁自旋锁LockSupport数据结构之双向链表设计模式之模板设计模式 AQS重要性 JAVA ------>JVM AQS ------>AQS 2. AQS入门级别理论知识 2.1 是什么? 2.1.1 字面意思 Abstract Queued Synchronizer----抽象的队列同步器 源码位置: …

【Microsoft Edge】如何彻底卸载 Edge

文章目录 一、问题描述二、卸载 Edge2.1 卸载正式版 Edge2.2 卸载非正式版 Edge2.2.1 卸载通用的 WebView22.2.2 卸载 Canary 版 Edge2.2.3 卸载其他版本2.3 卸载 Edge Update 2.4 卸载 Edge 的 Appx 额外安装残留2.5 删除日志文件2.6 我就是想全把 Edge 都删了 一、问题描述 …

预测模型的局部评价?

预测模型的局部评价 为什么要进行局部评价&#xff1f; 首先是临床决策曲线分析通常会给预测模型的使用规定一个阈值范围&#xff0c;相应地预测模型的评价也应该局限在这个范围之内才是合理的&#xff1b; 其次&#xff0c;全局性地评价往往不够敏感&#xff0c;即好的模型和坏…

本地搭建属于自己的ChatGPT:基于Python+ChatGLM-6b+Streamlit+QDrant+DuckDuckGo

本地部署chatglm及缓解时效性问题的思路&#xff1a; 模型使用chatglm-6b 4bit&#xff0c;推理使用hugging face&#xff0c;前端应用使用streamlit或者gradio。 微调对显存要求较高&#xff0c;还没试验。可以结合LoRA进行微调。 缓解时效性问题&#xff1a;通过本地数据库…

C语言实现银行家算法

一.银行家算法 1.由来 银行家算法最初是由荷兰计算机科学家艾兹赫尔迪杰斯特拉&#xff08;Edsger W. Dijkstra&#xff09;于1965年提出的。当时他正致力于解决多道程序设计中产生的死锁问题。在多道程序设计中&#xff0c;由于不同进程之间共享有限的系统资源&#xff0c;如…

【JavaEE初阶】多线程(一)认识线程 线程的创建 Thread的用法

摄影分享&#xff01; 文章目录 认识线程&#xff08;Thread&#xff09;概念执行多线程编程创建线程的写法1.继承Thread&#xff0c;重写run2.实现Runnable接口3.使用匿名内部类&#xff0c;继承Thread4.使用匿名内部类&#xff0c;实现Runable5.使用Lambda表达式 Thread用法…

C语言模拟银行排队叫号(链队)

一.队列 队列是一种具有先进先出&#xff08;FIFO&#xff09;特性的线性数据结构&#xff0c;它只允许在队列的两端进行插入和删除操作。队列的一端称为队尾&#xff08;rear&#xff09;&#xff0c;另一端称为队头&#xff08;front&#xff09;。新元素总是插入在队列的队…

怎么把m4a转换成mp3,分享几个方法给大家!

录音文件中经常出现m4a后缀的音频格式&#xff0c;但通常只能在特定的音频播放器中播放。如果你想把m4a转换成mp3&#xff0c;下面是四种简单易行的方法&#xff0c;适用于Windows 10操作系统。 方法一&#xff1a;使用记灵在线工具转换m4a成mp3 工具地址&#xff1a;记灵在线…

elsticsearch入门

查看所有索引&#xff08;表&#xff09; 向索引&#xff08;表&#xff09;中添加数据&#xff1a; 自定义id添加数据&#xff1a; 自定义id添加数据&#xff1a;方式二 查询数据&#xff1a; 查询索引&#xff08;表&#xff09;中全部数据&#xff1a; 全量修改单条数据&…

File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

【Leetcode -剑指Offer 22.链表中倒数第k个结点 -203.移除链表元素】

Leetcode Leetcode -剑指Offer 22.链表中倒数第k个结点Leetcode -203.移除链表元素 Leetcode -剑指Offer 22.链表中倒数第k个结点 题目&#xff1a;输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表…

数据结构(三)—— 哈希表

文章目录 一、哈希表积累1.1 哈希map1.2 哈希set 二、哈希表基础三、题3.1 242 有效的字母异位词3.2 349 两个数组的交集3.3 202 快乐数3.4 1 两数之和3.5 54 四数相加II 一、哈希表积累 什么时候想到用哈希法&#xff1a;当要需要查询一个元素是否出现过、判断一个元素是否出…

awvs安装批量扫描

文章目录 安装批量扫描 安装 1.2.AWVS下载   该工具可在官方网站下载&#xff0c;但免费下载的是14天试用版本。   官网下载&#xff1a;AWVS   百度云下载&#xff1a;百度云下载https://pan.baidu.com/s/1UO7GzL0CMemJ_TMQnHNOuA?pwdg1bm 提取码&#xff1a;g1bm 批…

浏览器状态同步和路由-前端路由和服务端路由原理

目录 前端路由和History API 浏览文境&#xff08;Browser Context&#xff09; 会话历史&#xff08;Session History&#xff09; History API history.go()切换当前会话&#xff0c;并不改变会话栈 history.back() history.go(-1) & history.forward() history.…

5.4、服务器编程基本框架和两种高效的事件处理模式

5.4、服务器编程基本框架和两种高效的事件处理模式 1.服务器编程基本框架2.两种高效的事件处理模式①Reactor模式②Proactor模式③模拟Proactor模式 1.服务器编程基本框架 模块功能I/O 处理单元处理客户连接&#xff0c;读写网络数据逻辑单元业务进程或线程网络存储单元数据库、…