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

 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; // 当前节点值域
}


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

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

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

相关文章

分布式与一致性协议之一致哈希算法(三)

一致哈希算法 如何使用一致哈希算法实现哈希寻址 我们一起来看一个例子&#xff0c;对于1000万个key的3节点KV存储&#xff0c;如果我们使用一致哈希算法增加1个节点&#xff0c;即3节点集群变为4节点集群&#xff0c;则只需要迁移24.3%的数据,如代码所示 package mainimpor…

微搭低代码入门03页面管理

目录 1 创建页面2 页面布局3 页面跳转总结 上一篇我们介绍了应用的基本操作&#xff0c;掌握了应用的概念后接着我们需要掌握页面的常见操作。 1 创建页面 打开应用的编辑器&#xff0c;在顶部导航条点击创建页面图标 在创建页面的时候可以从空白新建&#xff0c;也可以使用模…

【原件】软件需求分析报告

第1章 序言 第2章 引言 2.1 项目概述 2.2 编写目的 2.3 文档约定 2.4 预期读者及阅读建议 第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 …

Mysql复习笔记: 基础概念(待补充)

一. 基础概念 通用概念: 网络连接必须得分配给一个线程去进行处理&#xff0c;由一个线程来监听请求以及读取请求数据&#xff0c;比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句 在数据库中&#xff0c;哪怕执行一条SQL语句&#xff0c;其实也可以是一个独立…

PostgreSQL自带的命令行工具06- pg_isready

PostgreSQL自带的命令行工具06- pg_isready 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777pg_isready 是 Po…

2024牛客五一集训派对day2 Groundhog Looking Dowdy 个人解题思路

前言&#xff1a; 被实验室教练要求要打的这次五一牛客的训练赛&#xff0c;这些区域赛难度的题对于大一的我来说难度实在是太高了&#xff0c;我和我的队友只写了一些非常简单的签到题&#xff0c;其他题目都没怎么看&#xff08;我们太弱了&#xff09;&#xff0c;但我可以分…

线上线下交友社区系统,支持打包小程序/公众号/H5,源码交付!

上网交友的好处有很多&#xff0c;以下是一些主要的好处&#xff1a; 1. 拓展人际关系&#xff1a;通过上网交友可以认识更多的人&#xff0c;拓展自己的社交圈。这有助于扩大自己的视野、增加人生经验和开阔心胸。 2. 找到志同道合的朋友&#xff1a;在网络上&#xff0c;我们…

JavaWeb请求响应概述

目录 一、请求响应流程-简述 二、深入探究 三、DispatcherServlet 四、请求响应流程-详细分析 一、请求响应流程-简述 web应用部署在tomcat服务器中&#xff0c;前端与后端通过http协议进行数据的请求和响应。前端通过http协议向后端发送数据请求&#xff0c;就可以访问到部…

持续总结中!2024年面试必问 100 道 Java基础面试题(二十九)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;二十八&#xff09;-CSDN博客 五十七、静态内部类和普通内部类有什么区别&#xff1f; 在Java中&#xff0c;内部类是指定义在另一个类中的类&#xff0c;而内部类的类型有很多…

分割回文串(力扣131)

解题思路&#xff1a;仍就是上递归三部曲&#xff0c;但于此同时要明白此时的index就可以作为切割回文串的线了 具体代码如下&#xff1a; class Solution { private: vector<vector<string>> result; vector<string> path; // 放已经回文的子串 void back…

批量抓取某电影网站的下载链接

思路&#xff1a; 进入电影天堂首页&#xff0c;提取到主页面中的每一个电影的背后的那个urL地址 a. 拿到“2024必看热片”那一块的HTML代码 b. 从刚才拿到的HTML代码中提取到href的值访问子页面&#xff0c;提取到电影的名称以及下载地址 a. 拿到子页面的页面源代码 b. 数据提…

【leetcode】DFS递归题目总结

DFS&#xff08;深度优先搜索&#xff09; 深度优先搜索是一种用于遍历或搜索树或图的算法&#xff0c;其基本思路是从起始节点开始&#xff0c;沿着一条路径一直走到底&#xff0c;直到无法再走下去为止&#xff0c;然后回溯到上一个节点&#xff0c;继续走到另外一个路径&…

第二代增强-创建采购申请时的增强

文章目录 第二代增强-创建采购申请时的增强业务要求实现过程创建项目编写代码激活增强 维护消息类运行效果断点 第二代增强-创建采购申请时的增强 业务要求 实现过程 创建项目 编写代码 "AFNAM&#xff0c;申请人 "需求&#xff1a;NB类型的采购申请&#xff0c;需要…

嵌入式全栈开发学习笔记---C语言笔试复习大全10

目录 字符数组&#xff08;笔试重点&#xff09; 字符数组初始化 字符串数组输出 字符串的输入 字符串处理函数 puts()输出字符串 gets()输入字符串 strlen()计算字符串长度 strcpy()将后面的字符串拷贝到前面的字符串数组里面 笔试题12 strcmp()比较字符串的大小 …

自动化机器学习——网格搜索法:寻找最佳超参数组合

自动化机器学习——网格搜索法&#xff1a;寻找最佳超参数组合 在机器学习中&#xff0c;选择合适的超参数是模型调优的关键步骤之一。然而&#xff0c;由于超参数的组合空间通常非常庞大&#xff0c;手动调整超参数往往是一项耗时且困难的任务。为了解决这个问题&#xff0c;…

大模型引领NLP研究新范式:从统计机器学习到预训练语言模型

自然语言处理&#xff08;NLP&#xff09;研究范式经历了从浅层到深层、从局部到整体、从特定到通用的演进过程。下面我们来详细回顾这一过程。 一、早期的统计机器学习方法&#xff08;20世纪90年代 - 21世纪初&#xff09; 词袋模型&#xff08;Bag-of-Words&#xff09; 将…

C语言 | Leetcode C语言题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; void reserve(char* s) {int len strlen(s);for (int i 0; i < len / 2; i) {char t s[i];s[i] s[len - i - 1], s[len - i - 1] t;} }char* addBinary(char* a, char* b) {reserve(a);reserve(b);int len_a strlen(a), len_b st…

性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

大厂案例 - 通用的三方接口调用方案设计(中)

文章目录 Pre阿里云华为云【AK和SK生成方案】最佳实践1. 创建API密钥管理系统2. 生成AK和SK3. 存储和管理AK和SK4. 提供API密钥分发机制5. 安全性6. 其他注意事项 DB Model Design表结构Next考虑其他建议 API接口设计指导1. 使用POST作为接口请求方式2. 客户端IP白名单3. 单个接…

【研发管理】产品经理知识体系-产品创新流程

导读&#xff1a;产品创新流程是一个系统性的过程&#xff0c;旨在通过创造和引入新的产品或改进现有产品来满足市场需求、解决用户问题或实现竞争优势。 目录 1、产品创新引论 2、决策基本框架 3、模糊前端 4、产品创新流程模型概论 5、门径管理流程 6、并行工程和集成产…