树与二叉树

news2025/1/11 21:48:13

    我们之前讲过的链表和顺序表都是线性结构的数据结构,那么我们肯定会想有没有一种数据结构的形式不是线性结构而是其他的形式呢?今天我们就来学习一种新的数据结构——树形结构。

    🌵初识树形结构  

  树形结构就是像我们上面的图形一样。因为像是一颗倒立的树,越向下(树枝)数据越多所以得名。在我们的树形结构当中有一个特殊的节点也就是最上面的节点。我们所有的节点都是从最上面的节点展开的,所以它叫做我们树的根节点。假如我们将我们的根节点去掉,那么剩下的部分又会组成许多个树,这些树叫做子树。结构形式又和我们原先的形式相同,所以我们的树形结构是由无数个相同的结构组成,因此我们可以使用递归进行树的构建。

     需要注意的是:在树型结构当中每一个子树都是不相交的,每一个节点都只能拥有一个父节点并且N个节点当中都有N-1条边,否则该结构就不是树形结构。 

  就像我们上面三种样例所展示的那样,以上三种结构都不是树形结构。 

    🌵树的相关概念

  还以我们上面的图片中的样例进行学习,我们的树形结构拥有以下的概念:

     🥧节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6

     🥧叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点

     🥧非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点

     🥧双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点

     🥧孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点

     🥧兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6

     🥧节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

     🥧树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

     🥧堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点

     🥧节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

     🥧子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

     🥧森林:由m(m>0)棵互不相交的树的集合称为森林;

  我们在使用树形结构的时候会使用到上面的名词,所以需要对上述名词的含义具备一定的概念,便于我们后面的学习。

    🌵树形结构的构建

  话题回到我们对于代码的编写,我们树形结构的大致内容出来了,但是我们在编写代码的时候要怎样实现树形结构呢?

  首先来分析一下我们树形结构索要存储的内容。首先肯定要有的就是存储的数据,之后我们在查找树中的数据的时候肯定要查找我们相应的节点,所以我们还需要想办法进行查找同一层次的兄弟节点。那么我们也就有了以下的存储的形式:

  我们可以创建一个结构体,结构体当中存储有我们的孩子节点以及右兄弟节点的指针。 我们可以通过孩子节点找到下一层的数据节点,同样我们还可以通过右兄弟节点查找到我们同一层次的所有的节点。实际上也就是如下的查找形式:

  在我们使用的计算机当中文件的存储和管理使用的都是树形结构。在了解完大致的树形结构之后我们再来介绍一种特殊的树形结构——二叉树。

    🌵二叉树的结构和概念

  在我们的树形结构当中对于子节点的个数并没有进行限制,但是在我们的二叉树当中,我们一棵树的度只能为0,1,2。也就是我们一棵树的最大的度的个数不能超过2。(这也是我们n叉树的定义,最大的度为几就为几叉树)我们将存在的两个节点分别命名为左孩子节点和右孩子节点。二叉树的结构如下所示:

   需要注意的是我们二叉树当中的左右孩子节点的顺序不可以调换,因此我们的二叉树为有序树。同时在我们的二叉树当中可能出现如下的几种情况:   我们的二叉树可以为一棵空树,也可以只有一个根节点,并且允许只存在一个左节点或者右节点。这样的树型结构只要最大的度不超过2,都可以叫做二叉树。

  在我们的二叉树当中有两种特殊的二叉树:满二叉树和完全二叉树。

    🌵满二叉树

  

  当一个二叉树上面每一层的节点都满的时候,这样的二叉树就叫做满二叉树。因为第一层有一个节点之后每一层的节点个数每一次都扩大上一层的两倍,所以我们可以得出每一层的节点个数为2^(h-1),其中h表示层数。我们我们总节点的个数就为:2^h-1。我们对这节点的总数进行推导:

  之后我们可以利用这个公式进行很多关于二叉树的计算,我们需要将节点总数的公式记牢,避免现场推导浪费时间。 

    🌵完全二叉树 

   当我们一个二叉树当中的全部节点都相邻的时候就叫做完全二叉树。这里的相邻是指我们当我们最后一层的节点不满的时候我们的节点必须是一个左节点一个右节点再接着一个左节点......我们可以由一个左节点结束也可以由一个右节点结束。举几个简单的例子来帮助我们理解:

   一上两种情况都不是完全二叉树,因为我们可以发现我们最后一个节点并不是和我们前面的节点紧密相连的。

    🌵二叉树的重要性质

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

  ⭐由节点的总数可以推导出我们二叉树的高度:h=log(n+1)  (底数为2)

  我们可以利用上面两点性质进行对于部分选择题目或者填空题目的解决。

  那么以上就是我们本次博客的主要内容了,感谢您的观看。

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

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

相关文章

Java从入门到转行

Java开发从入门到转行 Java基本介绍Java学习路线Java学习须知Java学习文档Java SEJava 对象与类Java 基本数据类型Java 变量类型Java 修饰符Java 运算符Java 循环结构Java 条件语句Java switch caseJava 数组Java 日期与时间Java 正则表达式Java 方法Java 流(Stream)、 File、 …

A Restful API

SpringBoot 定义Restful API 定义POJOOrderBuyer 定义RestfulControllerGet API for queryPost API for addPut API for updateDelete API for delete 定义AjaxResponse Patavariable RequestParm RequestBodyRequestHeader 定义POJO Order import java.util.Date; import ja…

工厂方法模式

// 简单工厂模式 #include <iostream> #include <string>// 抽象产品类 class Product { public:virtual ~Product() {}virtual std::string getName() 0; };// 具体产品类A class ProductA : public Product { public:std::string getName() {return "Produ…

Swiper总结

文章目录 Swiper总结概述使用简单使用自动切换分页器样式切换效果预览视差效果延迟加载自适应高度放大缩小 案例tab切换引导页 Swiper总结 概述 Swiper是纯javascript打造的滑动特效插件&#xff0c;面向手机、平板电脑等移动终端。 Swiper能实现触屏焦点图、触屏Tab切换、触…

第三节课 Linux文件权限

Linux是多人多任务的操作系统&#xff0c;因此可能常常会有多人使用一台机器&#xff0c; 为了考虑每个人的隐私、方便用户合作&#xff0c;每个文件都有三类用户&#xff0c;权限是基于这三类用户设定的&#xff1a; 1) 文件拥有者&#xff08;user&#xff09; 2) 组用户&a…

SpringBoot 自定义注解实现Redis缓存功能

背景 最近小A的公司要做一个大屏可视化平台&#xff0c;主要是给领导看的&#xff0c;领导说这个项目要给领导演示&#xff0c;效果好不好直接关系到能不能拿下这个项目&#xff0c;领导还补了一句“这项目至少是百万级的&#xff0c;大伙要全力以赴”&#xff0c;早上小A还想…

走近大数据——什么是大数据、计算架构的发展

文章目录 一、什么是大数据二、大数据计算架构的发展1.RDBMS阶段2.Hadoop Map-Reduce阶段3.Spark阶段4.Flink阶段 参考 一、什么是大数据 大数据是指无法在有限时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合。 大数据的特点&#xff1a; 海量化&#xff1a;数…

少年不懂孔乙己,读懂已是书中人

文章目录 前言梗从何来互联网文学背后的焦虑给学弟学妹的建议 前言 《孔乙己》是近代文学巨匠鲁迅所著的短篇小说。 大概故事讲的是孔乙己是站着喝酒而穿长衫的&#xff08;那时候穿长衫的人代表着有知识&#xff09;唯一人&#xff0c;穿的虽然是长衫&#xff0c;可是又脏又破…

SpringMVC概述

SpringMVC概述 1. SpringMVC概述1.1 SpringMVC概述 2. 入门案例【重点】2.1 实现步骤2.2 代码实现【第一步】创建web工程&#xff08;Maven结构&#xff09;【第二步】设置tomcat服务器&#xff0c;加载web工程【第三步】导入坐标&#xff08;SpringMVCServlet&#xff09;【第…

璞华助力“数字人社”,为成都市人社数字化建设提供多方位的产品与技术支持!

新的时期&#xff0c;人力资源和社会保障事业进入新一轮的制度创新和加快发展阶段。把对各项人力资源和社会保障业务的支持和服务纳入信息化建设&#xff0c;通过 “数字人社”信息化建设项目&#xff0c;是充分利用新一代信息技术&#xff0c;有效整合各类信息资源&#xff0c…

ChatGPT背后的打工人:你不干,有的是AI干

AI“出圈” 如今&#xff0c;数字技术发展速度惊人&#xff0c;AI提高了社会生产效率&#xff0c;更真切地冲击到原有的生产秩序。 年初AI技术的爆发&#xff0c;让国内看到了进一步降本增效的希望。 国内多家互联网企业相继推出类ChatGPT产品&#xff0c;复旦大学邱锡鹏教授…

清洁赛道新势力,米博凭“减法”突围?

在五四青年节这个特殊的日子&#xff0c;方太旗下的高端智能清洁品牌“米博”发布了新一代无滚布洗地机7系列。 5月4日晚&#xff0c;米博以“减法生活&#xff0c;净请7代”为主题&#xff0c;举办了新品发布会。在发布会上&#xff0c;从小红书翻红的董洁作为方太集团米博产…

持之以恒奖牌来啦,带你提前看~

加油&#xff0c;让我们继续持之以恒吧&#xff01;

Flutter 中使用 dart:html 的条件导入

Flutter 中使用 dart:html 的条件导入 Flutter 是一个跨平台的 UI 框架&#xff0c;可以让你用一套代码开发 Android、iOS、Web 和桌面应用。但是&#xff0c;不同的平台有不同的特性和限制&#xff0c;所以有时候你可能需要根据平台来导入不同的库或代码。这时候&#xff0c;…

社交“搭子”火了!小红书数据分析,品牌正用“陪伴”种草?

找搭子&#xff0c;年轻人在搞一种很新的社交 朋友&#xff0c;你找搭子了吗&#xff1f;近期&#xff0c;“搭子”这种新型社交关系走红&#xff0c;饭搭子、奶茶搭子、厕所搭子、旅游搭子……遍布于各式各样的场景中&#xff0c;主打的就是一个垂直细分领域的精准陪伴。“搭子…

数字化转型:制造业企业,如何创新技术并借力发展?

数字中国峰会刚刚拉开帷幕&#xff0c;紧跟一波潮流。 在这个数字技术全面升级的关口&#xff0c;企业如何进更时代步伐&#xff0c;更好完成数字化转型和升级&#xff1f; 到底什么是数字化转型&#xff1f; 我们当下所看到的很多对“数字化”的理解&#xff0c;依然是“信…

【c++修行之路】模板

模板 一般我们在实现一个函数的时候&#xff0c;都会使用模板&#xff0c;因为如果将类型写死&#xff0c;下次再使用的时候就要新写一个函数&#xff0c;尽管重载可以让名字方便&#xff0c;但每重载都要自己去写一个函数&#xff0c;这样非常麻烦&#xff0c;所以模板就是让…

025 - C++ 接口(纯虚函数)

上一期我们学习了虚函数&#xff0c;本期我们学习一种特殊的虚函数&#xff0c;纯虚函数。 C 纯虚函数本质上与其他语言中的抽象方法或接口相同&#xff0c;基本上&#xff0c;纯虚函数允许我们在基类中定义一个没有实现的函数&#xff0c;然后强制子类去实现该函数。 我们可…

uni-app获取手机号

登录微信公众平台拿到自己的AppID(小程序ID)和AppSecret(小程序密钥) 微信公众平台 1.获取手机号首先要先登录拿到code&#xff0c;用code去获取session_key 2.获取 code需要知道自己的AppID(小程序ID)和AppSecret(小程序密钥) 3.解密 uni.login({success: (loginRes) > {…

提取Windows中系统自带的图标资源

写应用程序&#xff0c;如果想使用Windows下的图标&#xff0c;可以使用Visual Studio中的图标&#xff0c;比如VS2008的ImageLibrary&#xff08;笔者已经打包上传到CSDN&#xff09;&#xff0c;也可以使用Windows系统自带的图标。 Windows系统自带了不少高质量的图标资源&a…