二叉树基本概念讲解

news2024/11/24 17:31:18

一.树的概念

1.概念

树是⼀种非线性的数据结构,它是由 n(n>=0)个有限结点组成⼀个具有层次关系的集合。把它叫

做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,而叶朝下的。

有⼀个特殊的结点,称为根结点,根结点没有前驱结点。


除根结点外,其余结点被分成 M(M>0) 个互不相交的集合 T1、T2、……、Tm ,其中每⼀个集合

Ti(1 <= i <= m) ⼜是⼀棵结构与树类似的⼦树。每棵子树的根结点有且只有⼀个前驱,可以有0个

或多个后继。因此,树是递归定义的。

树形结构中,子树之间不能有交集,否则就不是树形结构。

 非树形结构:

  • 子树是不相交的(如果存在相交就是图了)
  • 除了根结点外,每个结点有且仅有⼀个父结点
  • ⼀棵N个结点的树有N-1条边

 2.树的相关定义

节点的度:一个节点含有的子树的个数称为该节点的度;如上图: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 )棵互不相交的树的集合称为森林;
较为常用的概念已用红色标出。

3.树的表示

树结构相对线性表就⽐较复杂了,要存储表示起来就比较⿇烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩⼦表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这⾥就简单的了解其中最常用孩子兄弟表示法

struct TreeNode
{
	struct Node* child; //左边开始的第一个孩子结点
	struct Node* brother; //指向其右边的下一个兄弟结点
	int data; //结点中的数据域
};

4.树形结构实际应用场景

⽂件系统是计算机存储和管理⽂件的⼀种⽅式,它利⽤树形结构来组织和管理⽂件和⽂件夹。在⽂件系统中,树结构被⼴泛应⽤,它通过⽗结点和⼦结点之间的关系来表⽰不同层级的⽂件和⽂件夹之间的关联。

例如,文件系统的表示就是一种树形结构。

二.二叉树

1.概念与结构

在树形结构中,我们最常⽤的就是⼆叉树。

⼀棵⼆叉树是结点的⼀个有限集合,该集合由⼀个根结点加上两棵别称为左⼦树和右⼦树的⼆叉树

组成或者为空。

从上图可以看出⼆叉树具备以下特点:

⼆叉树不存在度⼤于 2 的结点⼆叉树的⼦树有左右之分,次序不能颠倒,因此⼆叉树是有序树。

注意:对于任意的⼆叉树都是由以下⼏种情况复合⽽成的。

现实中的二叉树。

 2.特殊的二叉树

满二叉树
⼀个⼆叉树,如果每⼀个层的结点数都达到最⼤值,则这个⼆叉树就是满⼆叉树。

也就是说,如果⼀个⼆叉树的层数为 k ,且结点总数是2^k-1,则它就是满⼆叉树。

完全二叉树
完全⼆叉树是效率很⾼的数据结构,完全⼆叉树是由满⼆叉树⽽引出来的。对于深度为 K 的,有 n 个结点的⼆叉树,当且仅当其每⼀个结点都与深度为K的满⼆叉树中编号从1⾄ n 的结点⼀⼀对应时称之为完全⼆叉树。要注意的是满⼆叉树是⼀种特殊的完全⼆叉树。

二叉树的性质:

  1. 若规定根结点的层数为 1 ,则⼀棵⾮空⼆叉树的第i层上最多有2^i-1个结点
  2. 若规定根结点的层数为 1 ,则深度为 h 的⼆叉树的最⼤结点数是2^h-1
  3. 若规定根结点的层数为 1 ,具有 n 个结点的满⼆叉树的深度 log2(n+1)
  4.  对任何一棵二叉树, 如果度为0其叶结点个数为n1 , 度为2的分支结点个数为n2 ,则有 n1= n2+1

注意:关于第四点性质,在此处简单讲解一下:

二叉树是由一个个度为0的节点依次连接而成的,假设此时有1个度为0的节点A并插入一个节点B,此时A节点的度变为1,B节点的度依然还是0,度为0的节点数还是1个,度为1的节点数由0变成1个,而度为2的节点是由度为1的节点演化而来,当增加一个度为2的节点时,度为0的节点也会增加一个,类推即可得性质4. 

3.二叉树的存储结构

⼆叉树⼀般可以使⽤两种结构存储,⼀种顺序结构,⼀种链式结构 

1)顺序存储

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

2)链式存储

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

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

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

相关文章

动态规划基础一>面试题 08.01. 三步问题

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; public int waysToStep(int n) {/**1.创建dp表2.初始化3.填表4.返回值*/int MOD (int)1e9 7;//注意不能超出int范围&#xff0c;每做一次操作要取模//处理边界情况if(n 1 || n 2) return n;if(n 3) return 4;//1…

【小沐学CAD】ParaView Web的学习笔记(Python)

文章目录 1、简介1.1 visualizer1.2 Divvy1.3 Lite1.4 LightViz1.5 ArcticViewer1.6 HPCCloud1.7 glance1.8 trame 结语 1、简介 https://pvw.kitware.com/ VTK/ParaView Web&#xff0c;用于 Web 数据处理和可视化的框架 ParaViewWeb 是一个 Web 框架&#xff0c;用于在 Web …

[C++][第三方库][ODB]详细讲解

目录 1.介绍2.安装1.安装 build22.安装 odb-compiler3.安装 ODB 运行时库4.安装MySQL和客户端开发包5.安装 boost profile 库6.总体操作7.测试样例 3.ODB 常见操作1.ODB 类型映射2.ODB 编程1.指令2.示例 4.类与接口5.使用 1.介绍 ODB框架&#xff1a;数据库ORM框架 --> 对象…

vulnhub-Web Developer 1靶机

vulnhub&#xff1a;Web Developer: 1 ~ VulnHub 导入靶机&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.114.129&#xff0c;扫描端口 有网站服务&#xff0c;访问 没什么东西&#xff0c;扫目录 真不少&#xff0c;访问一下&#xff0c;也只是一些普通的Wordpr…

【机器学习】智驭未来:探索机器学习在食品生产中的革新之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#xff1a;探索机器学习在食品生产中的革新之路&#x1f4d2;2. 机器学习在食品质量控制中的应用&#x1f31e;实…

Crypto虐狗记---”你“和小鱼(六)

前言&#xff1a;剧情六 提示&#xff1a; 下载 手动&#xff1a; 脚本&#xff1a;我不会 参考大佬&#xff1a; 转轮机加密详解两种解题方法 -攻防世界-CSDN博客 import re sss1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE < 2: < KPBELNACZDTRXMJQOYHGVSFUWI < 3: < …

计算机的错误计算(一百一十五)

摘要 用错数定量解释计算机的错误计算&#xff08;一百一十四&#xff09;中的错误计算原因。 例1. 已知 计算 在 的错数&#xff0c;并与计算机的错误计算&#xff08;一百一十四&#xff09;中的相应错误数字个数做比较。 由 知&#xff0c; 再由 可得&#xff0c…

爬虫工程师必备工具——Postman和Fiddler的使用教程(11)

文章目录 1、工具获取2、基础使用教程2.1 Postman2.2 Fiddler2.2.1 简介2.2.2 工作原理2.2.3 功能设置2.2.4 使用方法1、工具获取 PostmanFiddler2、基础使用教程 2.1 Postman Postman是一款API调试工具,它简化了HTTP请求的构建、发送、响应查看以及测试流程,帮助开发人员高…

No.9 笔记 | PHP学习指南:从入门到精通的要点总结

一、PHP概述 1. Web技术基础 Web&#xff1a;由互相链接的超文本文件组成的系统URL&#xff1a;定位Web资源的地址HTTP&#xff1a;Web数据交换协议架构类型&#xff1a;B/S&#xff08;浏览器/服务器&#xff09;和C/S&#xff08;客户端/服务器&#xff09; 2. PHP简介 定…

无法加载响应数据: No data found for resourcewith given identifier

背景 学习黑马2022Redis教程&#xff0c;在开发P78达人探店功能&#xff0c;重新在前端登录的时候发现&#xff0c;所有的请求都需要发两遍才能成功。 失败的请求报错&#xff1a; 无法加载响应数据: No data found for resourcewith given identifier 排查 因为用到nginx,…

No.8 笔记 | SQL 查询语句:数据探索的钥匙

2024/10/7 心记 - 致在路上默默奋斗的你 在当今数字化的时代&#xff0c;网络安全已成为我们生活中不可或缺的一部分。它如同守护数字世界的隐形盾牌&#xff0c;保护着我们的隐私、数据和整个社会的稳定运行。 学习网络安全&#xff0c;是踏上一段充满挑战与机遇的征程。 每一…

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型)

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型&#xff09; 目录 Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型&#xff09; 1. 项目说明 2. 数据说明 &#xff08;1&#xff09;心跳信号分类预测数据集 3. 模型训练 &#xff08;1&#xff09;项目安装 &am…

查缺补漏----IP通信过程

1.DHCP协议 H3刚接入网络时&#xff0c;只知道自己的MAC地址&#xff0c;所以需要通过DHCP协议请求自己的IP地址。 通过DHCP协议&#xff0c;得到IP地址、子网掩码、网关与DNS服务器IP地址。 DHCP协议是应用层协议(传输层为UDP)&#xff0c;请求报文是广播&#xff08;H3不知…

深入了解Python:那些常被忽略的知识点

作为现代编程语言的典范&#xff0c;Python以其简洁、高效和广泛的应用领域赢得了无数开发者的青睐。然而&#xff0c;即使是经验丰富的Python程序员&#xff0c;也可能不了解Python的一些特性或最佳实践。这篇文章将介绍Python中常被忽略的一些知识点&#xff0c;通过全面的分…

图文深入理解Oracle DB Scheduler

值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。今天继续宅继续写。本篇图文深入介绍Oracle DB Scheduler。 Oracle为什么要使Scheduler&#xff1f; 答案就是6个字&#xff1a;简化管理任务。 • Scheduler&#xff08;调度程序&#x…

代码随想录训练营Day26 | 669. 修剪二叉搜索树 | 108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树

学习文档&#xff1a;代码随想录 (programmercarl.com) Leetcode 669. 修剪二叉搜索树 题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留…

o1-preview 在 IMO 2024 第一题的实测表现

相关博客&#xff1a;Learning to Reason with LLMs 以及 Introducing OpenAI o1-preview 测试了 IMO 2024 的第一题&#xff0c;OpenAI-o1-preview 的解题过程包括两部分&#xff1a;思考和推理。 正确答案是全体偶数&#xff0c;o1-preview 的 **思考方向正确&#xff0c;推…

计算机网络——email

pop3拉出来 超出ASCII码范围就不让传了 这样就可以传更大的文件

Linux命令大全及小例子

撰写一份关于Linux命令大全的详尽报道和分析是一项重要的任务&#xff0c;旨在让读者全面了解Linux命令的用途和应用场景。Linux系统因其强大的命令行工具而闻名&#xff0c;无论是系统管理、文件操作还是网络配置&#xff0c;Linux命令行都提供了灵活且强大的解决方案。以下是…

【模板进阶】std::void_t

一、 s t d : : v o i d _ t std::void\_t std::void_t的源码分析和常规范例 1. s t d : : v o i d _ t 1.std::void\_t 1.std::void_t的源码分析 C 17 C17 C17引入了 s t d : : v o i d _ t std::void\_t std::void_t&#xff0c;它其实是一个别名模板&#xff0c;源码非常简…