【数据结构】二叉树(一)——树和二叉树的概念及结构

在这里插入图片描述

前言:
本篇博客主要了解什么是树,什么是二叉树,以及他们的概念和结构。


文章目录

  • 一、树的概念及结构
    • 1.1 树的基本概念
    • 1.2 树的相关特征
    • 1.3 树的实现
  • 二、二叉树的概念及性质
    • 2.1 二叉树的概念
    • 2.2 二叉树的性质

一、树的概念及结构

1.1 树的基本概念

树(Tree)是一种非线性数据结构,是一种层次结构,其中每个节点都有一个父节点(除了根节点)和零个或多个子节点。

树(Tree)这个数据结构被称为“树”,是因为它的图形结构在形状上类似于自然界中的倒立的树。

考虑一棵真实的树,它有一个主干(树干),从树干上生长出许多分支,这些分支又分支出更小的枝叶,最终形成树冠。整体上,树的形状呈分层的结构,从根部到叶子的路径是有序的。

对比到数据结构中的树,树的根节点相当于树的根部,而节点和边的层次结构形成了树状的分支。这种分层结构反映了树的层次性质,每一层都代表了不同的层次或深度。

在这里插入图片描述
当判断一个数据结构是否是树时,可以考虑以下几个特点:

  1. 有且仅有一个根节点: 树结构只有一个根节点,所有的其他节点都通过边连接到根节点。

  2. 每个节点有零个或多个子节点: 每个节点可以有零个或多个子节点,这些子节点也是树的节点,形成了树的分支结构。

  3. 没有循环: 在树中不能存在环,即不能有从某个节点出发经过若干边回到该节点的路径。

  4. 节点之间是有序的: 树中的节点之间是有序的,即每个节点都有一个特定的位置,而子节点的顺序也是确定的。这个顺序通常是由添加或创建节点的顺序来确定的。

  5. 任意两节点间有唯一路径: 从树的根节点到任意一个节点,都有唯一的路径。

以下是一些非树的例子
在这里插入图片描述


1.2 树的相关特征

在这里插入图片描述

  1. 节点的度: 一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
  2. 叶节点或终端节点: 度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点
  3. 非终端节点或分支节点: 度不为0的节点; 如上图:D、E、F、G…等节点为分支节点
  4. 双亲节点或父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
  5. 孩子节点或子节点: 一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
  6. 兄弟节点: 具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
  7. 树的度: 一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
  8. 节点的层次: 从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 树的高度或深度: 树中节点的最大层次; 如上图:树的高度为4
  10. 堂兄弟节点: 双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
  11. 节点的祖先: 从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
  12. 子孙: 以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
  13. 森林: 由m(m>0)棵互不相交的树的集合称为森林;

1.3 树的实现

树有很多种实现方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法
等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

孩子兄弟表示法通常每个节点保存了指向其第一个孩子节点和其右兄弟节点的指针。

//兄弟表示法
struct TreeNode {int data; //用于保存节点的数据struct TreeNode* firstChild;   //指向第一个孩子节点的指针struct TreeNode* rightSibling; //指向右边一个兄弟节点的指针
};

结构图:
在这里插入图片描述
树在生活中有许多的应用:

  1. 文件系统: 文件系统通常以树的形式组织文件和目录。每个目录可以包含文件和子目录,形成了一个层次结构。

  2. 电子游戏中的场景图: 在游戏设计中,场景图常常以树结构表示游戏场景中的对象关系和层次。

  3. 组织结构: 公司或组织的层次结构可以使用树表示。每个节点可能代表一个部门,员工,或者项目。

  4. 决策树: 在机器学习中,决策树用于分类和回归分析,帮助模型做出决策。

  5. 图形学中的场景图: 用于表示3D场景中的对象关系,方便进行渲染和交互。


二、二叉树的概念及性质

2.1 二叉树的概念

二叉树是树的一种特殊情况,其中每个节点最多有两个子节点,分别是左子节点和右子节点。

在这里插入图片描述
从上图可以看出:

  1. 二叉树不存在度大于2的节点
  2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

注意:对于任意的二叉树都是由以下几种情况复合而成的:
在这里插入图片描述


2.2 二叉树的性质

  1. 满二叉树: 如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为 k k k,且结点总数是 2 k − 1 2^k-1 2k1 ,则它就是满二叉树。
  2. 完全二叉树: 完全二叉树也是一种特殊的二叉树,它和满二叉树的主要区别在于,除了最后一层,其他层的节点都是紧凑排列的,而且最后一层的节点都尽量靠左排列。如果最后一层的节点没有填满,那么缺失的节点会从左到右依次排列。 要注意的是满二叉树是一种特殊的完全二叉树。

在这里插入图片描述

  1. 若规定根节点的层数为1,则一棵非空二叉树的第 i i i层上最多有 2 ( i − 1 ) 2^{(i-1)} 2(i1)个结点.
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2 h − 1 2^h-1 2h1
  3. 若规定根节点的层数为1,具有n个结点的满二叉树的深度, h = l o g 2 ( n + 1 ) h= log_2(n+1) h=log2(n+1)
  4. 对于具有 n n n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
  • i > 0 i>0 i>0 i i i位置节点的双亲序号为 ( i − 1 ) / 2 (i-1)/2 (i1)/2 i = 0 i=0 i=0 i i i为根节点编号,无双亲节点
  • 2 i + 1 < = n 2i+1<=n 2i+1<=n,左孩子序号为 2 i + 1 2i+1 2i+1
  • 2 i + 2 < = n 2i+2<=n 2i+2<=n,右孩子序号为 2 i + 2 2i+2 2i+2

在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

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

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

相关文章

Java技术栈 —— Redis的雪崩、穿透与击穿

Java技术栈 —— Redis的雪崩、穿透与击穿 〇、实验的先导条件&#xff08;NginxJmeter&#xff09;一、Redis缓存雪崩、缓存穿透、缓存击穿1.1 雪崩1.2 穿透1.3 击穿 二、Redis应用场景——高并发2.1 单机部署的高并发问题与解决&#xff08;JVM级别锁&#xff09;2.2 集群部署…

快速搭建知识付费小程序,3分钟即可开启知识变现之旅

产品服务 线上线下课程传播 线上线下活动管理 项目撮合交易 找商机找合作 一对一线下交流 企业文化宣传 企业产品销售 更多服务 实时行业资讯 动态学习交流 分销代理推广 独立知识店铺 覆盖全行业 个人IP打造 独立小程序 私域运营解决方案 公域引流 营销转化 …

SDH、MSTP、OTN和PTN的关系

在开始之前&#xff0c;先要解释一下TDM的概念。 TDM&#xff0c;就是时分复用&#xff0c;就是将一个标准时长&#xff08;1秒&#xff09;分成若干段小的时间段&#xff08;8000&#xff09;&#xff0c;每一个小时间段&#xff08;1/8000125us&#xff09;传输一路信号。 …

OpenEular23.09(欧拉)操作系统为企业搭建独立的K8S集群环境,详细流程+截图

一.环境&#xff1b; win10&#xff0c;vmware16 pro&#xff0c;openeular23.09&#xff0c;linux内核 6.4.0-10.1.0.20.oe2309.x86_64&#xff0c; docker-engine 2:18.09.0-328&#xff0c;kubernetes 1.25.3&#xff0c;containerd 1.6.22&#xff0c;calico v3.25 集群…

Unity 点击对话系统(含Demo)

点击对话系统 可实现点击物体后自动移动到物体附近&#xff0c;然后弹出对话框进行对话。 基于Unity 简单角色对话UI脚本的编写&#xff08;新版UI组件&#xff09;和Unity 关于点击不同物品移动并触发不同事件的结合体&#xff0c;有兴趣可以看一下之前文章。 下边代码为U…

【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]

阅读导航 引言一、function包装器1. 概念2. 基本使用3. 逆波兰表达式求值&#xff08;1&#xff09;普通写法&#xff08;2&#xff09;使用包装器以后的写法 二、bind() 函数温馨提示 引言 很高兴再次与大家分享关于 C11 的一些知识。在上一篇文章中&#xff0c;我们讲解了 c…

JDK、JRE、JVM的联系与区别

JDK、JRE、JVM的联系与区别 一、JDK,JRE,JVM定义 JDK(Java Development Kit),包含JRE,以及增加编译器和调试器等用于程序开发的文件。 JRE(Java Runtime Environment)&#xff0c;包含Java虚拟机、库函数、运行Java应用程序所必须的文件。 JVM(Java Virtual Machine)是一个虚…

c++ 类和对象

目录 基本概念类的定义类的基本使用对象的实例化访问控制符 面向对象程序设计方法实例 构造函数和析构函数构造函数定义总结 析构函数定义作用 多个对象构造和析构 对象的动态建立和释放new和deletenew delete和malloc free区别 对象的赋值利用实例化好的对象对另外一个对象初始…

力扣hot100 二叉树的直径

&#x1f468;‍&#x1f3eb; 题目地址 一个节点的最大直径 它左树的深度 它右树的深度 &#x1f60b; AC code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* Tr…

5.云原生安全之ingress配置域名TLS证书

文章目录 cloudflare配置使用cloudflare托管域名获取cloudflare API Token在cloudflare中配置SSL/TLS kubesphere使用cert-manager申请cloudflare证书安装证书管理器创建Secret资源创建cluster-issuer.yaml创建cert.yaml申请证书已经查看申请状态 部署harbor并配置ingress使用证…

C++上位软件通过Snap7开源库访问西门子S7-200/合信M226ES数据块的方法

前言 上一篇文章中介绍了Snap7访问西门子S7-1200/S7-1500 DB块的方法&#xff0c;对于S7-200PLC是没有数据块访问的。S7-200PLC中Snap7只能通过访问MB块&#xff0c;VB块的方法进行和PLC之间的Snap7通信和数据交换。手头没有S7-200PLC故通过合信CTMC M226ES运动控制器进行测试&…

魔改版小市值策略

策略思路 最近几年&#xff0c;小市值策略一直都收益不错&#xff08;当然&#xff0c;不包含17年和18年&#xff09;。小市值因子对收益的影响是很大的。特别是行情不好的时候&#xff0c;大家都忙着炒作热点&#xff0c;那么这时候符合题材的小市值更加符合炒作标准了。 为…

Superset服务安装

文章目录 Superset概述Superset应用场景Superset安装及使用安装Python环境安装Miniconda下载Miniconda(Python3版本)安装Miniconda取消每次登陆自动激活conda base环境创建Python3.7(Superset)环境配置conda国内镜像创建Superset环境激活Superset环境查看python版本 Superset部…

AWS(三):如何在AwsManagedAd目录和windowsAD实例之间建立双向信任。

前提&#xff1a; 1.创建好了一个AWS managed AD目录&#xff0c;我的目录域名为:aws.managed.com 2.创建好了一个windows AD实例并提升了为域控服务器,实例域名为:aws2.com 看过我AWS 一和二的应该都会创建windows实例了&#xff0c;切记不能将其无缝加入到aws managed AD的…

Vue 模板编译原理解析

Vue 模板编译原理解析 模板编译整体流程 首先我们看一下什么是编译&#xff1f; 所谓编译&#xff08;Compile&#xff09;&#xff0c;指的是将语言 A 翻译成语言 B&#xff0c;语言 A 就被称之为源码&#xff08;source code&#xff09;&#xff0c;语言 B 就被称之为目标…

【QML】与 C++ 混合编程:互相调用函数

文章目录 qml 调用 C 函数案例 a&#xff1a;Q_INVOKABLE 标记 C 函数 视图设置进 qml 属性案例 b&#xff1a;qml 通过发送信号的方式&#xff0c;调用 Qt 槽函数 C调用qml函数 qml 调用 C 函数 qml 要使用 C 的函数有两个方法&#xff1a; 一种是&#xff0c;用 Q_INVOKABLE…

STM32 学习(三)OLED 调试工具

目录 一、简介 二、使用方法 2.1 接线图 2.2 配置引脚 2.3 编写代码 三、Keil 工具调试 一、简介 在进行单片机开发时&#xff0c;有很多调试方法&#xff0c;如下图&#xff1a; 其中 OLED 就是一种比较好用的调试工具&#xff1a; OLED 硬件电路如下&#xff0c…

7步教你如何快速建立电子商务网站

如果您需要以客户为中心搭建电子商务网站&#xff0c;或者您正在寻求开展电子商务业务&#xff0c;那么您很幸运——现在是开始的最佳时机&#xff01;事实上&#xff0c;在疫情期间&#xff0c;电子商务销售额增长了 50%。电子商务现在是一个价值 8700 亿美元的产业。随着如此…

深入了解Apache 日志,Apache 日志分析工具

Apache Web 服务器在企业中广泛用于托管其网站和 Web 应用程序&#xff0c;Apache 服务器生成的原始日志提供有关 Apache 服务器托管的网站如何处理用户请求以及访问您的网站时经常遇到的错误的重要信息。 什么是 Apache 日志 Apache 日志包含 Apache Web 服务器处理的所有事…

rime中州韵小狼毫 inputShow lua Filter 输入字符透传滤镜

在 rime中州韵小狼毫 inputShow lua Translator 一文中&#xff0c;我们通过 inputShow.lua 定制了 inputShow_translator&#xff0c;这使得我们的输入方案可以将用户输入的字符透传到候选列表中来。如下&#x1f447;&#xff1a; &#x1f446;上图中我们在候选列表中看到了…