椋鸟数据结构笔记#5:树、二叉树基础

news2024/10/6 16:28:47

文章目录

          • 树的相关概念
          • 树的表示
        • 二叉树基础
          • 二叉树分类
            • 满二叉树
            • 完全二叉树
          • 二叉树的性质
          • 二叉树的存储结构
            • 顺序存储
            • 链式存储

萌新的学习笔记,写错了恳请斧正。

树是一种非线性的数据结构,它是由 n 个节点组成的一个具有层次关系的数据集合。其大概结构如下图:

在这里插入图片描述

其形状类似于一棵倒挂的树,由此得名。

树的相关概念
  • 节点:树中每一个存储数据的元被称为节点。上方示意图中A~Q都是这棵树的节点。
  • 根节点:根节点没有父节点,是整棵树的最上面的节点,是该树其他所有节点的发源。也就是上面示意图中的A节点。
  • 父节点(双亲节点):就是树中与某节点相连但在其“上方”的节点。比方说,上方示意图中A是BCDEFG的父节点、E是IJ的父节点。
  • 子节点(孩子节点):与父节点相对,就是树中与某节点相连但在其“下方”的节点。比方说,上方示意图中BCDEFG都是A的子节点。
  • 兄弟节点:有相同父节点的节点互为兄弟节点。比方说,上方示意图中B与C互为兄弟节点、P与Q互为兄弟节点。
  • 堂兄弟节点:只要两个节点互不为兄弟节点但处于树的同一层(与根节点的距离相同,则称其为堂兄弟节点。比方说,上方示意图中H与J互为堂兄弟节点。
  • 节点的祖先:一个节点到根节点的唯一路径上所有的节点都是该节点的祖先。比方说,上方示意图中A节点为所有节点的祖先。
  • 节点的子孙:又某一个节点“向下”延伸出来的所有节点都是该节点的子孙。比方说,上方示意图中其他所有节点都是A节点的子孙。
  • 子树:把根节点的一个子节点拿出来,这个节点与其所有子孙再次组成一棵树,这棵树就称为母树(原本的树)的一棵子树。比方说上方示意图中E、I、J、P、Q就构成了母树的一棵子树。注意子树可以只有一个根节点
  • 节点的度:一个节点的子树的个数称为节点的度。比方说,上方示意图中A节点的度为6
  • 树的度:一棵树最大的节点的度就是这棵树的度。比方说,上方示意图中树的度就是A节点的度,为6.
  • 叶节点(终端节点):度为0的节点(没有子节点)就是叶节点。比方说,上方示意图中BCHIKLMNPQ都是叶节点。
  • 分支节点(非终端节点):度不为0的节点(有子节点)就是分支节点。比方说,上方示意图中ADEFGJ都是分支节点。
  • 森林:多颗不相连的树组成森林。
树的表示

树的表示方法有多种,这里介绍较为常用的左孩子右兄弟表示法。这个方法能够让我们方便的向下查找。

我们定义一个结构体作为树的节点:

typedef int TDataType	//树存储的数据类型

typedef struct Tree
{
	TDataType data;
    struct Tree* lChild;
    struct Tree* rSibling;
} Tree;

这个结构体中,lChild存储该节点最左边的子节点,rSibling存储与其紧邻的右侧兄弟节点

这样,我们还是以上方示意图为例,为了方便我再次把图片贴出:

在这里插入图片描述

如果我们想通过A节点找到P节点,这时问题就会变的非常简单了,只需要按照如下路线图寻找即可:

lChlid
rSibling*3
lChlid
rSibling
lChild
A
B
E
I
J
P

如果想要子节点也能向上寻找,那还可以再结构体中添加一个成员用于储存父节点。

二叉树基础

二叉树是一种特殊的树结构,其特征为每一个节点都有且只有两个子树或空子树

下方是一个二叉树的示意图(其中2节点的右子树就是空):

在这里插入图片描述

我们还可以更加抽象一点,下图同样也是一个二叉树:

在这里插入图片描述

二叉树分类

有两种特殊的二叉树类型需要我们单独的来看一看,它们是满二叉树完全二叉树

满二叉树

一个二叉树如果每一层的节点数都达到最大,那这就是一个满二叉树,一个 k 层的满二叉树的节点总数是 2k - 1 。

在这里插入图片描述

完全二叉树

完全二叉树的概念看图很好理解,但是用文字描述就比较复杂了。++对于深度为 K 的有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 K 的满二叉树中编号从 1 至 n 的节点一一对应时称之为完全二叉树++{.wavy}。

在这里插入图片描述

二叉树的性质
  1. 一棵非空二叉树的第 i 层上最多有 2i-1 个节点
  2. 深度为 h 的二叉树的最大节点数是 2h - 1
  3. 对任何一棵二叉树,若度为 0 的节点个数为 n0 ,度为 2 的节点个数为 n2 ,那么 n0 = n2 + 1
  4. 具有 n 个节点的满二叉树深度为 log2(n + 1)
  5. 若逐层从左至右给每一个节点编号(根节点编号0),那么对应序号为 i 的节点:
    1. i 的父节点的编号为 ⌊ ( i − 1 ) / 2 ⌋ \lfloor (i-1)/2 \rfloor ⌊(i1)/2 (当 i > 0 i>0 i>0时)
    2. i 的左孩子节点编号为 2 i + 1 2i+1 2i+1(当 2 i + 1 < n 2i+1<n 2i+1<n时)
    3. i 的右孩子节点编号为 2 i + 2 2i+2 2i+2(当 2 i + 2 < n 2i+2<n 2i+2<n时)
二叉树的存储结构

实现二叉树我们一般有两种存储结构,一种是顺序存储,一种是链式存储

顺序存储

顺序存储就是用顺序表(数组)来存储节点,一般来说只适用于完全二叉树

因为对于完全二叉树,我们可以逐层从左至右给节点编号,存储在数组对应位置,再通过二叉树的性质轻易找到其父节点或左右孩子节点。

在这里插入图片描述

如果不是完全二叉树,这样中间就会有大量的空节点,造成空间浪费。

对于这种存储方式,将在下一篇笔记通过堆(一种基于二叉树的数据结构)来实现与细致的讲解。

链式存储

链式存储就是用链表来存储二叉树的节点。一般来说有两种实现,分别是二叉链和三叉链。

二叉链就是链表的每个节点由数据域和左右指针域组成,左右指针分别指向左孩子与右孩子节点。对于一些更复杂的数据结构,我们可能会使用到基于三叉链的二叉树,也就是再增加一个指针指向其父节点。

//Binary Tree 二叉树
typedef int BTDataType;
    
//二叉链
typedef struct BTNode
{
    struct BTNode* lChild;
    struct BTNode* rChild;
    BTDataType data;
} BTNode;

//三叉链
typedef struct BTNode
{
    struct BTNode* lChild;
    struct BTNode* rChild;
    struct BTNode* parent;
    BTDataType data;
} BTNode;

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

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

相关文章

算法学习——LeetCode力扣补充篇3(143. 重排链表、141. 环形链表、205. 同构字符串、1002. 查找共用字符、925. 长按键入)

算法学习——LeetCode力扣补充篇3 143. 重排链表 143. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → …

题目:小蓝的神秘行囊(蓝桥OJ 3937)

问题描述&#xff1a; 解题思路&#xff1a; 二维优化01背包模板题。与一维优化01背包不同在于多增加一维。 代码&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e2 9; int dp[N][N]; //二维的01背包&#xff0c;dp[i][j]&#xff1a;i是体…

【SpringCloud】一文详谈Nacos

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

metasploit使用及内网笔记

1 基本操作 Metasploit就是一个漏洞框架。它的全称叫做The Metasploit Framework&#xff0c;简称叫做MSF。Metasploit作为全球最受欢迎的工具&#xff0c;不仅仅是因为它的方便性和强大性&#xff0c;更重要的是它的框架。它允许使用者开发自己的漏洞脚本&#xff0c;从而进行…

Dockerfile和Docker-compose

一、概述 Dockerfile和Docker Compose是用于构建和管理 Docker 容器的两个工具&#xff0c;但它们的作用和使用方式不同。 Dockerfile Dockerfile 是一个文本文件&#xff0c;用于定义 Docker 镜像的构建规则。它包含一系列指令&#xff0c;如 FROM&#xff08;指定基础镜像…

RAG:检索增强生成系统如何工作

随着大型语言模型&#xff08;LLM&#xff09;的发展&#xff0c;人工智能世界取得了巨大的飞跃。经过大量数据的训练&#xff0c;LLM可以发现语言模式和关系&#xff0c;使人工智能工具能够生成更准确、与上下文相关的响应。 但LLM也给人工智能工程师带来了新的挑战&#xff…

System.gc 之后到底发生了什么 ?

本文基于 OpenJDK17 进行讨论 在 JDK NIO 针对堆外内存的分配场景中&#xff0c;我们经常会看到 System.gc 的身影&#xff0c;比如当我们通过 FileChannel#map 对文件进行内存映射的时候&#xff0c;如果 JVM 进程虚拟内存空间中的虚拟内存不足&#xff0c;JVM 在 native 层就…

将整数的二进制位的奇偶数位交换

✅博客主页:爆打维c-CSDN博客​​​​​​ &#x1f43e; &#x1f539;分享c语言知识及代码 以下是一个用于交换整数二进制位的宏&#xff1a; #define SWAP_BITS(num) (((num) & 0xAAAAAAAA) >> 1) | (((num) & 0x55555555) << 1)这个宏利用了二进制掩…

WordPress AutomaticPlugin SSRF漏洞复现(CVE-2024-27954)

0x01 产品简介 WordPress是一款免费开源的内容管理系统(CMS),最初是一个博客平台,但后来发展成为一个功能强大的网站建设工具,适用于各种类型的网站,包括个人博客、企业网站、电子商务网站等,并逐步演化成一款内容管理系统软件。 0x02 漏洞概述 WordPress AutomaticPlu…

让工作自动化起来!无所不能的Python

让工作自动化起来&#xff01;无所不能的Python 一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一内容简介作者简介前言读者对象如何阅读本书购买链接参与方式 随着我国企业数字化和信息化…

Shell与Bash与POSIX与Linux间的关系

shell是什么&#xff1f; Shell的英语翻译是“壳”&#xff0c;其作用也跟名字差不多&#xff0c;为操作系统套个壳&#xff0c;人与操作系统的壳交互。与壳相对应的则是操作系统内核&#xff0c;一个“壳”一个“核”。核从1970年代开始就基本定型了&#xff0c;没什么大的改…

QA测试开发工程师面试题满分问答4: 如何测试购物车功能?

当测试一个购物车时&#xff0c;我们需要采用全面的测试策略&#xff0c;以确保购物车在各种情况下的功能正常、性能良好和用户体验优秀。以下是一个详细的测试计划&#xff0c;包含了各个方面的测试。 功能测试&#xff1a; 添加商品到购物车&#xff1a;验证能否将商品成功添…

基于深度学习的端到端自动驾驶的最新进展:调研综述

基于深度学习的端到端自动驾驶的最新进展&#xff1a;调研综述 附赠自动驾驶学习资料和量产经验&#xff1a;链接 论文链接&#xff1a;https://arxiv.org/pdf/2307.04370.pdf 调研链接&#xff1a;https://github.com/Pranav-chib/ 摘要 本文介绍了基于深度学习的端到端自…

书生浦语笔记一

2023年6月&#xff0c;InternLM的第一代大模型正式发布。仅一个月后&#xff0c;该模型以及其全套工具链被开源。随后&#xff0c;在8月份&#xff0c;多模态语料库chat7B和lagent也被开源。而在接下来的9月份&#xff0c;InternLM20B的开源发布进一步加强了全线工具链的更新。…

猜数游戏(Python)

一、实验要求&#xff1a; &#xff08;1&#xff09;在游戏开始时&#xff0c;随机生成一个1~100之间的整数。 &#xff08;2&#xff09;在游戏中&#xff0c;玩家有10次机会猜数。如果10次都没有猜中&#xff0c;则游戏失败&#xff1b;否则&#xff0c;游戏成功。 &…

Linux:查询类型的命令type

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 type命令是Linux中一个查询类型的命令&#xff0c;它可以查询name是alias别名、keyword关键字、function函数名、builtin内建命令名&#xff08;这很有用&#xff09;或…

Linux系统使用Docker部署MeterSphere并实现公网访问本地测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

20240401,ALOHA WORLD

C了&#xff0c;虽然练习C还有9题不会做&#xff0c;但是不先继续往下学&#xff0c;肯定就凉了 #include <iostream> int main() {if (__cplusplus 201703L)std::cout << "C17\n";else if (__cplusplus 201402L)std::cout << "C14\n"…

Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

C++ | Leetcode C++题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {map<int,int> a;//提供一对一的hashvector<int> b(2,-1);//用来承载结果&#xff0c;初始化一个大小为2&#xff0c;值为-1的容…