【数据结构】--- 深入剖析二叉树(上篇)--- 初识树和二叉树

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:         9ilk

(๑•́ ₃ •̀๑) 文章专栏:      数据结构之旅


🏠 初识树

📒 树的概念

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

  • 正如现实生活中的树一样,我们的树数据结构也有一个根结点,根节点没有前驱结点
  • 树是递归定义的,根节点下有多个分支也就是多个子树,多个子树下又有多个子树
  • 对于一颗树可以拆解成根和n颗子树,同样,子树也可以按照相同方式拆分,直到不可拆分

⚠️  1.子树不能有交集

       2.除了根结点外,每个结点只能有一个父亲

       3.一颗N个结点的树有N-1条边

以下的都是子树有交集的,不能叫做树

      4.树中不能有环,有环就是图了

为了方便我们深入了解树,我们来普及一些树中的专有名词 ~

📒 树中的专有名词

                         

  • 孩子结点或子结点:某一个结点含有的子树的根结点,如上图中的B,C,D..都是A的子结点
  • 双亲结点:若一个节点含有子节点,则这个节点称为其子节点的父节点,,如上图中的A都是B,C,D..的双亲结点
  • 兄弟结点:顾名思义,就是有同个双亲结点的子节点,如上图的D,E是兄弟,I,J是兄弟。
  • 堂兄弟结点:双亲在同一层的节点互为堂兄弟,如上图的I和K是堂兄弟,注意堂兄弟结点的双亲结点不同
  • 结点的祖先从根到该节点所经分支上的所有节点,如上图A是所有结点祖先,E是IJQP祖先。
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙.如上图所有结点都是A的子孙,IJQP是E的子孙。
  • 结点的度:一个节含有的子树的个数称为该节点的度。
  • 叶子结点或终端结点度为0的结点,也就是没有子树,如上图的P,Q。
  • 分支结点或非终端结点:度大于0的结点,如上图的D,H,F...
  • 树的度:认为最大的节点的度称为树的度。
  • 结点的层次:从根开始定义起,根为第1层(以根为第一层方便区分空树和非空树),根的子节点为第2层,如上图的E层次是2
  • 树的高度或深度:树中节点的最大层次,如上图树的深度是4
  • 森林:由m(m>0)棵互不相交的树的集合称为森林。(互不相交不仅指没有交集,还有归属关系)

📒 树的表示方法

  • 线性表表示
struct TreeNode
{
    int val;
    struct TreeNode** subA;
    int size;
    int capacity;
}
  • 双亲表示法 孩子表示法

这两种较为复杂,博主就不演示了,本人推荐看这位博主文章树的表示

  • 左孩子右兄弟
    struct TreeNode
    {
       struct TreeNode* leftchild;
       struct TreeNode* rightbrother;
       int data;
    }

🏠 初识二叉树

📒 何为二叉树

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

1. 或者为空

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

⚠️ 1.二叉树的结点的度一定是大与等于0且小于等于2的

      2.二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
      3.二叉树可以是空树或只有根结点

        

📒 完全二叉树 vs 满二叉树

  • 满二叉树

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

  • 完全二叉树

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

⚠️ 

1.满二叉树是特殊的完全二叉树

2.满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

3.完全二叉树要求最后一层结点从左到右连续

📒 二叉树的性质

  • 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2^(i-1)个结点
  • 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h - 1 .

推导过程如下图

  • 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= log(n+1). (ps:是log以2

    为底,n+1为对数).

推导:设树的高度为h,则n  = 2^(h) - 1; 因此n+1 = 2^h ---> h = log(n+1);

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

推导:假设该二叉树有n个结点,则该二叉树有n-1条边。由于结点个数n=不同度结点个数之和,即n = n0 + n2 + n1;又由于度为2的结点有两条边,度为1的结点有1条边,故可以得到等式关系 n0 + n2 + n1 - 1 = n2 x 2 + n1 x 1;整理可得n0 = n2 + 1. 

  • 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
  1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
  2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
  3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

📒 二叉树的存储结构

  • 顺序存储

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

由图中我们可以得知,非完全二叉树采用顺序存储会造成空间的浪费。

结论:数组存储只适合完全二叉树和满二叉树

那有什么存储结构表示非完全二叉树而不造成空间的浪费呢?

  • 链式存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链。

二叉链

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
  struct BinTreeNode* _pLeft; // 指向当前节点左孩子
  struct BinTreeNode* _pRight; // 指向当前节点右孩子
  BTDataType _data; // 当前节点值域
}

三叉链

// 三叉链
typedef int BTDataType;
struct BinaryTreeNode
{
 struct BinTreeNode* _pParent; // 指向当前节点的双亲
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
}


树上篇到这里就结束啦,下篇博客将介绍二叉树延伸堆及其涉及的算法,望小伙伴们多多支持啊!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode354. 俄罗斯套娃信封问题

Every day a Leetcode 题目来源&#xff1a;354. 俄罗斯套娃信封问题 解法1&#xff1a;动态规划 我们必须要保证对于每一种 w 值&#xff0c;我们最多只能选择 1 个信封。 首先我们将所有的信封按照 w 值第一关键字升序、h 值第二关键字降序进行排序&#xff1b; 随后我们…

QT+串口调试助手+扩展版

前言&#xff1a;此文章是这篇文章的拓展 QT串口调试助手基本版-CSDN博客&#xff0c;如果需要独立完成串口调试助手直接看基本版文章即可&#xff0c;如果需要完成串口调试助手的其他功能&#xff0c;参考拓展版。 一、更新QT串口调试助手UI界面 1、ui串口设置界面 2、ui串口…

Java与Go: 生产者消费者模型

什么是生产者消费者模型 生产者-消费者模型&#xff08;也称为生产者-消费者问题&#xff09;是一种常见的并发编程模型&#xff0c;用于处理多线程或多进程之间的协同工作。该模型涉及两个主要角色&#xff1a;生产者和消费者&#xff0c;一个次要角色&#xff1a;缓冲区。 生…

Unity---版本控制软件

13.3 版本控制——Git-1_哔哩哔哩_bilibili Git用的比较多 Git 常用Linux命令 pwd&#xff1a;显示当前所在路径 ls&#xff1a;显示当前路径下的所有文件 tab键自动补全 cd&#xff1a;切换路径 mkdir&#xff1a;在当前路径下创建一个文件夹 clear&#xff1a;清屏 vim…

EtherCAT通信总线状态监视

1、EtherCAT总线运动控制学习笔记 EtherCAT总线运动控制学习笔记(RXXW_Dor)_汇川pdo控制命令607a-CSDN博客文章浏览阅读3.3k次,点赞3次,收藏9次。说到总线控制,就要说到报文、对象字典、PN通信我们大部分会说报文,EtherCAT通信我们常说对象字典,叫法不一样,但是原理基…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架&#xff0c;详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架&#xff0c;专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口&#xff0c;可以用于构建神经网络模型&#xff0c;并…

数据结构---单链表

题目&#xff1a;构造一个单链表。 使用的软件&#xff1a;VS2022使用的语言&#xff1a;C语言使用的项目&#xff1a;test.c Setlist.h Setlish.c 项目实践&#xff1a; Setlist.h的代码为&#xff1a; #pragma once#include<stdio.h> #include<stdlib.h> #incl…

SQL注入基础-3

一、宽字节注入 1、宽字节&#xff1a;字符大小为两个及以上的字节&#xff0c;如GBK&#xff0c;GB2312编码 2、数据库使用GBK编码时&#xff0c;会将两个字符合并为一个汉字(宽字节)。特殊值字符如单引号都会被转义【--->\】&#xff0c;如sqli-lads第32关&#xff0c;输…

【C++】学习笔记——vector_2

文章目录 七、vector2. vecotr的使用3. vector的模拟实现 未完待续 七、vector 2. vecotr的使用 上节我们以二维数组结束&#xff0c;这一节我们以二维数组开始。 // 二维数组 vector<vector<int>> vv;二维数组在底层是连续的一维数组。vv[i][j] 是怎样访问的&a…

Sarcasm detection论文解析 |使用基于多头注意力的双向 LSTM 进行讽刺检测

论文地址 论文地址&#xff1a;https://ieeexplore.ieee.org/document/8949523 论文首页 笔记框架 使用基于多头注意力的双向 LSTM 进行讽刺检测 &#x1f4c5;出版年份:2020 &#x1f4d6;出版期刊:IEEE Access &#x1f4c8;影响因子:3.9 &#x1f9d1;文章作者:Kumar Avinas…

第11章 软件工程

这里写目录标题 1.软件过程1.1能力成熟度模型(CMM)1.2能力成熟度模型集成(CMMI)1.3瀑布模型(线性顺序)1.4增量模型1.5演化模型1.5.1原型模型1.5.2螺旋模型 1.6喷泉模型1.7统一过程(UP)模型 2.敏捷方法3.系统设计4.系统测试4.1单元测试(模块测试)4.2集成测试4.3黑盒测试(功能测试…

论文辅助笔记:Tempo之modules/prompt.py

1 get_prompt_param_cls 2 get_prompt_value 3 Prompt 类 3.1 _init_weights 3.2 forward

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

gige工业相机突破(一,准备资源)

gige相机能不能绕开相机生产商提供的sdk&#xff0c;而直接取到像&#xff1f; 两种办法&#xff0c;第一&#xff0c;gige vision2.0说明书&#xff0c;第二&#xff0c;genicam 首先你会去干什么事&#xff1f; 好几年&#xff0c;我都没有突破&#xff0c;老虎吃天&#x…

产品AB测试设计

因为vue2项目升级到vue3经历分享1&#xff0c;vue2项目升级到vue3经历分享2&#xff0c;前端系统升级&#xff0c;界面操作也发生改变&#xff0c;为了将影响降到最低&#xff0c;是不能轻易让所有用户使用新系统的。原系统使用好好的&#xff0c;如果新界面用户不喜欢&#xf…

2024/5/5 英语每日一段

Meanwhile, in a twist, Tesla this month settled a high-profile case in Northern California that claimed Autopilot played a role in the fatal crash of an Apple engineer, Walter Huang. The company’s decision to settle with Huang’s family—along with a ruli…

如何打包Apk适配32和64位

一个表格了解lib下的文件夹 .so文件描述armeabi-v7a第七代及以上的ARM处理器&#xff0c;2011年以后生产的大部分Android设备都使用。arm64-v8a第8代、64位ARM处理器&#xff0c;很少设备&#xff0c;三星GalaxyS6是其中之一。armeabi第5代、第6代的ARM处理器&#xff0c;早期…

Mysql报错红温集锦(一)(ipynb配置、pymysql登录、密码带@、to_sql如何加速、触发器SIGNAL阻止插入数据)

一、jupyter notebook无法使用%sql来添加sql代码 可能原因&#xff1a; 1、没装jupyter和notebook库、没装ipython-sql库 pip install jupyter notebook ipython-sql 另外如果是vscode的话还需要安装一些相关的插件 2、没load_ext %load_ext sql 3、没正确的登录到mysql…

Git-flow分支管理与Aone-flow分支管理对比

Git-flow分支管理与Aone-flow分支管理对比 git-flow分支管理&#xff1a; master: 主分支&#xff0c;主要用来版本发布。 hotfix&#xff1a;线上 bug 紧急修复用到的临时分支。这个分支用来修复主线master的BUG release&#xff08;预发布分支&#xff09;&#xff1a;rel…

深入理解网络原理2----UDP协议

文章目录 前言一、UDP协议协议段格式&#xff08;简图&#xff09;校验和 二、UDP与TCP 前言 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;就有了⽹络互连。 一、UDP协议 协…