二叉树基础总结

news2024/11/26 14:50:45

目录

树的定义:

深度和高度:

二叉树

由来

二叉树种类:

满二叉树:

完全二叉树:

严格二叉树(Strict Binary Tree):

平衡二叉树(Balanced Binary Tree):

存储结构(顺序存储和链式存储)

顺序存储

优点:

缺点:

链式存储

链式存储结构的主要特点包括:

二叉树的遍历

前序遍历

代码实现(递归):

中序遍历

代码实现(递归):

后序遍历

代码实现(递归):

层序遍历有点复杂,下一篇专门写这方面的总结。


树的定义:

树(层级结构)是一种重要的非线性数据结构(递归的数据结构),它由n(n≥0)个有限节点组成一个具有层次关系的集合。这些节点具有如下特性:(在一个有效的树中,如果有n个节点,就会有n-1条边。)

  1. 每个节点有零个或多个子节点。
  2. 没有父节点的节点称为根节点。根:树的最顶部的节点,唯一没有双亲的节点。
  3. 每一个非根节点有且只有一个父节点。
  4. 除了根节点外,每个子节点可以分为多个不相交的子树。

树的术语包括:

  1. 结点:使用树结构存储的每一个数据元素都被称为“结点”。
  2. 森林:多棵互不相交的树的集合称为森林。
  3. 有序树和无序树:如果树中结点的子树从左到右看有规定的顺序,这棵树称为有序树;反之称为无序树。

树的最常见实现方式:就是动态创建节点,用指针或者引用把他们链接起来。

如下图:

链接是有方向的,它不是双向而是单向的。当我们遍历一棵树的时候,只能从一个方向进行。

深度和高度:

树的深度(Depth):从根节点开始自顶向下逐层累加,直到最远的叶节点。换句话说,最深的叶结点的深度就是树的深度。如果有多个叶节点位于同一最大深度,那么树的深度就是这个最大深度。因此,树的深度等于树中节点的最大层次。同一深度的节点可以被称为同一级的节点。

树的高度(Height):从树的底层叶节点开始自底向上逐层累加,直到根节点。也就是说,树的高度就是从根节点到最远叶节点的最长路径长度。对于任何树,树的高度等于树的最大层数。

值得注意的是,有些教材或资料在定义树的高度时,可能会将其定义为根节点的高度,即从根节点到最远叶节点的最长路径长度减一。这种定义方式在实际应用中也较为常见。

二叉树

由来

树还有不同的类型,例如二叉树。二叉树是树型结构的一个重要类型,它的每个节点的度(即子节点的数量)不大于2。这意味着二叉树的每个节点最多有两个子节点,通常被称为左子节点和右子节点。

二叉树种类:

满二叉树

是一种特殊的二叉树,其特点是除最后一层外,每一层上的所有节点都有两个子节点。也就是说,如果一个二叉树的深度为K,且结点总数是(2^k) -1,则它就是满二叉树。满二叉树的每一层都包含最大数量的节点,因此在给定深度下,满二叉树具有最多的节点。满二叉树是完全二叉树的特例,完全二叉树是指除最后一层外,其他层的节点数达到最大,且最后一层的节点都集中在左边。在满二叉树中,因为每一层都已经满了,所以它也是一棵完全二叉树。

完全二叉树

是由满二叉树而引出的概念。对于深度为k的有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,这棵二叉树被称为完全二叉树。也就是说,如果对树中的结点按从上至下、从左到右的顺序进行编号,编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树就是完全二叉树。

完全二叉树的特点包括:

  1. 叶子结点只能出现在最下层和次下层。
  2. 最下层的叶子结点集中在树的左部。
  3. 倒数第二层若存在叶子结点,一定在右部连续位置。
  4. 如果结点度为1,则该结点只有左孩子,即没有右子树。
  5. 同样结点数目的二叉树,完全二叉树深度最小。

需要注意的是,满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。另外,完全二叉树第i层至多有2^(i-1)个节点,共i层的完全二叉树最多有2^i - 1个节点。

严格二叉树(Strict Binary Tree):

是二叉树的一种特殊类型,它的特点是每个非终端节点(非叶子节点)都有且仅有两个子节点。也就是说,在严格二叉树中,不存在只有一个子节点或没有子节点的非终端节点。严格二叉树与满二叉树和完全二叉树有所不同。满二叉树要求除最后一层外,每一层上的所有节点都有两个子节点,而严格二叉树则只要求非终端节点有两个子节点,对叶子节点没有要求。完全二叉树则要求除最后一层外,其他层的节点数达到最大,且最后一层的节点都集中在左边,而严格二叉树则没有这个要求。

平衡二叉树(Balanced Binary Tree):

是一种特殊的二叉树,其特点是在进行插入、删除等操作后,依然能保持树的平衡性,即任何节点的两个子树的高度差的绝对值不超过1。平衡二叉树有多种实现方式,如AVL树和红黑树等。平衡二叉树的重要性在于它能够保证在最坏情况下,查找、插入和删除操作的时间复杂度都是O(log n),这对于处理大量数据非常有效。如果没有平衡性,最坏情况下二叉树可能退化为链表,导致时间复杂度变为O(n)。

存储结构(顺序存储和链式存储)

顺序存储

二叉树的顺序存储结构通常使用数组来实现。在顺序存储结构中,二叉树中的每个节点按照完全二叉树的顺序存储在一个数组中。完全二叉树的特性使得这种存储方式成为可能,因为在完全二叉树中,除了最后一层之外,其他层的节点数都是满的,并且最后一层的节点都集中在左边。

对于任意一个在数组中的位置为i的节点,其左孩子节点的位置可以通过计算 2i+1 得到,其右孩子节点的位置可以通过计算 2i+2 得到。同样地,对于任意一个位置为j的孩子节点,其父节点的位置可以通过计算 (j-1)/2 得到。

优点:

顺序存储结构的优点是可以快速地访问任意节点,因为每个节点都有一个固定的数组索引。

缺点:

这种存储方式的缺点也很明显,即它可能会浪费存储空间。因为在二叉树中,如果节点数较少,那么数组中的很多位置可能都是空的。此外,对于非完全二叉树,这种存储方式也无法直接表示。

总的来说,顺序存储结构适用于完全二叉树或者节点数较多的二叉树。对于其他类型的二叉树,或者节点数较少的二叉树,链式存储结构可能是一个更好的选择。

链式存储

链式存储结构,又称为链接存储结构,是一种数据的存储方式。

在这种结构中,每个数据元素(通常称为节点)除了包含自身的信息(称为信息域)外,还包含指向其逻辑关系中的下一个节点的指针(称为指针域)。因此,每个节点都通过其指针域与其逻辑关系中的下一个节点相连。这种存储方式不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有的弱点。

链式存储结构的主要特点包括:

  1. 存储密度比顺序存储结构小,因为每个节点都需要额外的存储空间来存储指向下一个节点的指针。
  2. 插入和删除操作灵活,节点可以被插入到链表的任何位置,包括首、中、末,而且不需要移动其他节点中的指针。
  3. 链表的大小可以按需伸缩,是一种动态存储结构,因此在增加或删除元素时性能更高。
  4. 查找节点时的效率相对较低,因为只能从第一个节点开始逐个查找,直到找到所需的节点。

总的来说,链式存储结构是一种非常有用的数据结构,特别适用于需要频繁进行插入和删除操作的情况。然而,由于其查找效率相对较低,因此在需要频繁查找的情况下可能不是最佳选择。

二叉树的遍历

二叉树的每个节点都只会被访问一次。

二叉树有一个前驱和两个后继。

二叉树的遍历顺序有4种,分别是:前序遍历,中序遍历,后序遍历和层序遍历。

前序遍历

先访问根节点,再访问左右子树。

运动轨迹如下:

 

代码实现(递归):
void Tree(Tree* root) {
	if (root == NULL) {
		return;
	}
	printf("%d", root->data);
	Tree(root->L_ch);
	Tree(root->R_ch);
}

中序遍历

先访问左子树,再访根节点,最后访问右子树。

运动轨迹如下:

代码实现(递归):
void Tree(Tree* root) {
	if (root == NULL) {
		return;
	}
    Tree(root->L_ch);
	printf("%d", root->data);
	Tree(root->R_ch);
}

后序遍历

先左子树,再右子树,最后根节点。

运动轨迹如下:

代码实现(递归):
void Tree(Tree* root) {
	if (root == NULL) {
		return;
	}
    Tree(root->L_ch);
    Tree(root->R_ch);
	printf("%d", root->data);
}

层序遍历有点复杂,下一篇专门写这方面的总结。

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

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

相关文章

【阅读笔记】空域保边降噪《Side Window Filtering》

1、保边滤波背景 保边滤波器的代表包括双边滤波、引导滤波,但是这类滤波器有一个问题,它们均将待处理的像素点放在了方形滤波窗口的中心。但如果待处理的像素位于图像纹理或者边缘,方形滤波核卷积的处理结果会导致这个边缘变模糊。 基于这个…

算法刷题:有效三角形个数

有效三角形个数 .题目链接题目详情算法原理补充知识点双指针:对撞指针 我的答案 . 题目链接 有效三角形个数 题目详情 算法原理 补充知识点 有效三角形需要满足的条件: ab>cac>bbc>a 其实在满足1的时候,c是最大的,那么2和3是显然成立的,因此我们可以这样解题: 对…

【北邮鲁鹏老师计算机视觉课程笔记】10 Classification 分类

【北邮鲁鹏老师计算机视觉课程笔记】10 Classification 分类 1 图像识别的基本范式 检测问题:不仅要知道有没有,还要知道在哪里 分类是整图级标签,检测是区域级标签,分割是像素级标签 2 检测任务的应用 3 单实例识别与类别识别…

九、OpenCV自带colormap

项目功能实现&#xff1a;每隔1500ms轮流自动播放不同风格图像显示&#xff0c;按下Esc键退出 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 colormap.h #pragma once #include<opencv2/opencv.hpp> using namespace cv;class ColorMap { public:vo…

Rust 数据结构与算法:1算法分析之乱序字符串检查

Rust 数据结构与算法 一、算法分析 算法是通用的旨在解决某种问题的指令列表。 算法分析是基于算法使用的资源量来进行比较的。之所以说一个算法比另一个算法好,原因就在于前者在使用资源方面更有效率,或者说前者使用了更少的资源。 ●算法使用的空间指的是内存消耗。算法…

浅谈业务场景中缓存的使用

业务场景中缓存的使用 一、背景二、缓存分类1.本地缓存2.分布式缓存 三、缓存读写模式1.读请求2.写请求 四、缓存穿透1.缓存空对象2.请求校验3.请求来源限制4.布隆过滤器 五、缓存击穿1.改变过期时间2.串行访问数据库 六、缓存雪崩1.避免集中过期2.提前更新缓存 七、缓存与数据…

初始JAVA

目录 一、输出HelloWorld 1.1开发步骤 1.2 编写 1.3 编译 1.4 运行 二、 HelloWorld小结 2.1 Java程序的结构与格式 2.2 Java程序的入口 2.3 两种常见的输出语句 2.4 源文件名与类名 三、 注释(comment) 四、 Java API文档 五、 Java核心机制&#xff1a;JVM 5.1…

OpenAI宣布ChatGPT新增记忆功能;谷歌AI助理Gemini应用登陆多地区

&#x1f989; AI新闻 &#x1f680; OpenAI宣布ChatGPT新增记忆功能&#xff0c;可以自由控制内存&#xff0c;提供个性化聊天和长期追踪服务 摘要&#xff1a;ChatGPT新增的记忆功能可以帮助AI模型记住用户的提问内容&#xff0c;并且可以自由控制其内存。这意味着用户不必…

第三百二十二回

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理 3. 示例代码4. 内容总结 我们在上一章回中介绍了"FadeInImage组件"相关的内容&#xff0c;本章回中将介绍CachedNetworkImage组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

随机过程及应用学习笔记(三)几种重要的随机过程

介绍独立过程和独立增量过程。重点介绍两种独立增量过程-—维纳过程和泊松过程。 目录 前言 一、独立过程和独立增量过程 1、独立过程&#xff08;Independent Process&#xff09; 2、独立增量过程&#xff08;Independent Increment Process&#xff09; 二、正态过程&am…

202324读书笔记|《谢谢你一直陪着我》——谈一场健康的恋爱,玩玩闹闹,一起到老

202324读书笔记|《谢谢你一直陪着我》——谈一场健康的恋爱&#xff0c;玩玩闹闹&#xff0c;一起到老 《谢谢你一直陪着我》作者肥肥鲨&#xff0c;这是一本恋爱小绘本&#xff0c;肥肥鲨和粉粉鲨的相处小片段&#xff0c;轻松读物值得一读。 情人节夜晚熬夜看完的小漫画&am…

边缘计算第二版施巍松——第8章边缘计算系统实例

8.1边缘计算系统概述 1.Cloudlet 架构&#xff1a;移动设备-Cloudlet-云 cloudlet也可以像云一样为用户提供服务&#xff0c;Cloudlet离移动设备只有一跳的距离&#xff0c;具有物理距离的临近性&#xff0c;可以保证实时反馈时延低&#xff0c;又可以利用局域网的高带宽优势&…

《Java 简易速速上手小册》第6章:Java 并发编程(2024 最新版)

文章目录 6.1 线程的创建和管理 - 召唤你的士兵6.1.1 基础知识6.1.2 重点案例&#xff1a;实现一个简单的计数器6.1.3 拓展案例 1&#xff1a;定时器线程6.1.4 拓展案例 2&#xff1a;使用 Executor 框架管理线程 6.2 同步机制 - 维持军队的秩序6.2.1 基础知识6.2.2 重点案例&a…

如何合理规划 PostgreSQL 的数据库用户

PostgreSQL 作为世界上最领先的开源数据库&#xff0c;有一套强大的用户角色权限系统&#xff0c;和 MySQL 做一个对比&#xff1a; 但硬币的另一面则是对于简单场景来说增加了复杂度。在许多单应用场景&#xff0c;其实也不需要额外的 schema 层&#xff0c;也不需要额外的 ow…

MATLAB | 情人节画个花瓣venn图?

之前七夕节情人节各种花&#xff0c;相册&#xff0c;爱心啥的都快画够了&#xff0c;今年画个花瓣韦恩图&#xff1f; 花瓣上的数字是仅属于该类的样本数&#xff0c;而中心的数字是属于每一类的样本数 教程部分 0 数据准备 % 给组起名t1 t2 t3...t15 setName compose(t%d,…

(五)【Jmeter】使用代理录制HTTP脚本操作步骤及注意事项

前置信息 软件版本Jmeter5.6.3 服务网址备注drupalhttp://192.168.88.88:18080/&#xff08;二&#xff09;【Jmeter】专栏实战项目靶场drupal部署 用户名密码test1test1test2test2 实操记录 1、启动jmeter&#xff0c;操作顺序见下图 2、在视图面板添加如下信息&#x…

【复现】某某ERP 信息泄露漏洞_49

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 该ERP基于SpringBoot框架和SaaS模式&#xff0c;立志为中小企业提供开源好用的ERP软件&#xff0c;目前专注进销存财务生产功能。…

【AI视野·今日NLP 自然语言处理论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 17 Jan 2024 (showing first 100 of 163 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deductive Closure Training of Language Models for Coherence, Accur…

优思学院|工业4.0:世界上首个工业机器人诞生于50年前

五十年前&#xff0c;德国机床制造商库卡&#xff08;KUKA&#xff09;推出了FAMULUS工业机器人&#xff0c;这不仅是现代工业机器人发展史上的一个重要里程碑&#xff0c;也为后来的技术革新铺平了道路。1973年&#xff0c;世界见证了一种拥有六轴的多关节臂动力学设计的机器人…

『运维备忘录』之 Lsof 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…