让二叉树无处可逃

志不立,天下无可成之事。 ——王阳明


二叉树

  • 1、树?什么是树
    • 1、1、基本概念
    • 1、2、树的相关概念
    • 1、3、树的表示方式
    • 1、4、树的实际运用
  • 2、二叉树?只有两个分支吗?
    • 2、1、基本概念
    • 2、2、二叉树的相关定义
    • 2、3、二叉树的相关性质
    • 2、4、二叉树的表示方式
  • 3、总结

1、树?什么是树

1、1、基本概念

树也是属于一种数据结构,它是一种非线性的数据结构,与栈,队列和链表是不同的存在。
由n(n>=0)个有限的结点组成的具有层次关系的集合。至于为什么是树呢?其实按照结构图来看,把一颗二叉树的结构图倒过来就像一颗树了。在这里插入图片描述

在这里插入图片描述
也就是像这样。
1、树都会有一个特殊的结点,称为根节点,根节点没有父节点
2、除去根节点之后,其余的结点被分为M(M>0)个互不相交的集合T1,T2,Tm,其中每一个集合又是一棵结构类似的子树。
3、因此,树是递归定义的。(在后面的关于树之类的问题上,递归的解决方法占很大一部分)

注意:根据观察,其实真正的树,根和根之间不会相互交错。那计算机的树其实也是,子树也是不能有交集的,否则将不会是树的结构。在这里插入图片描述

1、2、树的相关概念

在这里插入图片描述

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

1、3、树的表示方式

相对于线性表的表示,由于树的不确定的性质,树的存储表示会相对比较麻烦,不只是需要保存树中的数值,还要保证节点和节点之间的关系。由于树的复杂性,所以树的表示方法也会出现多元化,就比如:双亲表示法,孩子表示法,孩子双亲表示法以及孩子兄弟表示法等。在这里不方便多说,就简单的介绍几种常用的方法孩子兄弟表示法(也是一个很妙的表示方法)

typedef int DataType;
struct Node
{struct Node* _firstChild1; // 第一个孩子结点struct Node* _pNextBrother; // 指向其下一个兄弟结点DataType _data; // 结点中的数据域
};

在这里插入图片描述
这就是通过孩子找兄弟,让父节点只指向一个节点,而处于同一层的都通过,带头的兄弟来找到。

下面的这个就是我简单的写一下其余的表示方法,因为相对于其余的方法,我对于孩子兄弟法还是更喜欢一点的。
在这里插入图片描述
这里的我想到的问题,在这篇文章有详细的讲解,关于指针的,如果不熟悉,可以再看一下

1、4、树的实际运用

在这里插入图片描述

2、二叉树?只有两个分支吗?

2、1、基本概念

二叉树也是一棵节点的有限集合
1、可能为空
2、由根节点加上两棵左子树和右子树的二叉树构成。在这里插入图片描述
1、二叉树不存在度大于2的节点
2、二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序的树

二叉树也可以通过递归的方式来组成,二叉树也只能分为这几种情况在这里插入图片描述

2、2、二叉树的相关定义

特殊的二叉树
==1、满二叉树:==一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k)-1,则它就是满二叉树。
==2、完全二叉树:==完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树

2、3、二叉树的相关性质

二叉树很类似与我们高中学习的生物中的关于细胞分裂的公式。(下面的公式都是相当于根节点的层数是1的情况下)
1、一棵非空的二叉树的第i层上的节点个数最多有2^(k-1)个节点。
2、深度为h的二叉树最大节点数为2^h-1。
3、如果度为 0 的节点个数为 n0 ,度为 2 的节点个数为 n2 ,那么则有n0=n2+1
4、一个有n个节点的满二叉树,那么它的深度为log(n+1),log是以2为底
(ps:明天出一个关于树相关的问题集合,感兴趣的记得关注!)

2、4、二叉树的表示方式

看过树的介绍,不难发现,二叉树相对与树的结构多样,规则变化,二叉树相对简单,所以对于二叉树的存储方式来说也是更简单一点
1、顺序存储
顺序结构就是用数组来存储,一般来说,数组的使用**只适合表示完全二叉树,**对于不是完全二叉树时会有空间的浪费。二叉树顺序存储在物理结构上是数组,但是逻辑结构上是一棵二叉树。
正常来说,这种的数组结构都是大部分存储 堆
在这里插入图片描述
2、链式存储
用链表来表示一棵二叉树
在这里插入图片描述
在这里插入图片描述
转换成代码的形式,也就是相当于这样

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

3、总结

对于二叉树其实本质上的基础就只有那么多,下面会推出二叉树的衍生的结构,堆。对于二叉树的问题和操作都会在之后推出,敬请期待。

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

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

相关文章

C++: vector

目录 1.vector的介绍 2.vector常用的接口 1.vector构造 2.迭代器iterator的使用 3.vector空间增长 4.vector的增删改查 3.vector模拟实现 如果在reverse时使用memcpy会怎么样? 1.vector的介绍 C中的vector是一个动态数组容器,可以存储任意类型的…

simulink限幅模块-Saturation

限幅模块 限幅模块(Saturation)对输出值施加了上下限约束。当输出值超过上限时,限定于上限值输出;当输出值低于下限时,限定于下限值输出;在上下限之间时,保持原输出。Saturation模块默认包含一…

网络安全--防御保护02

第二天重要的一个点是区域这个概念 防火墙的主要职责在于控制和防护---安全策略---防火墙可以根据安全策略来抓取流量之后做出对应的动作 防火墙的分类: 单一主机防火墙:专门有设备作为防火墙 路由集成:核心设备,可流量转发 分…

为什么单片机不能直接驱动继电器和电磁阀?

为什么单片机不能直接驱动继电器和电磁阀? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!&…

Spring核心容器IOC案例讲解,带你理解IOC

Universe Infinity inc. 什么是IOC容器,先把IOC给忽略到,其实就是个容器。 什么?容器又是个啥玩意?容器是用来放东西的东西啊。 各个领域都喜欢起一些专业术语,显得很高级。给你讲IOC是不是很高级,给你讲Map是不是就明白了。 bean对象最终存储在spring容器中,在spring源…

配置Mycat服务

1.安装mycat 2.修改配置 vim /usr/local/mycat/conf/users/root.user.json 设置客户端连接mucat 服务器时 使用的用户名和密码:定义客户端连接mycat服务使用用户及密码: vim /usr/local/mycat/conf/datasources/prototypeDs.datasource.json 访问 3306使用的账…

vue3源码(一)搭建开发环境

Monorepo:是管理项目代码的一个方式,指在一个项目仓库(repo)中管理多个模块/包(package) vue3源码采用Monorepo管理项目 vue3项目架构 搭建Monorepo环境 1.全局安装pnpm npm install pnpm -g # 全局安装pnpm pnpm init -y # 初始化配置文件创建.npmrc文件&#x…

代码随想录算法训练营day28 || 93.复原IP地址,78.子集,90.子集II

视频讲解: 回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集_哔哩哔哩_bilibili 回溯算法解决子集问题…

Docker基础语法

目录 一.docker安装 二.docker基础名词 三.docker基础命令 四.命令别名 五.数据卷 六.挂载本地目录或文件 七.Docker镜像 八.网络 一.docker安装 1.安装yum工具 yum install -y yum-utils device-mapper-persistent-data lvm2 2.安装 docker yum源 yum-config-manag…

【Effective C++11】5. 实现

Item26 尽量延后变量定义式的出现时间 定义变量(自定义变量)未使用,会承担构造成本和析构成本,考虑以下场景: 如果有异常出现,encrypted 没有被使用,但是会付出构造和析构的成本;通…

WEB前端伪类选择器以及伪元素选择器

表单补充 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#" method"get" enctype"text/plain"><!-- <input type"…

EXECL 单元格字符串链接 CONCAT :应用:将一行数据转为json

源&#xff1a; 目标 函数表示 CONCAT("data", CHAR(10), "{", CHAR(10), " ", "ulAlarmId : ", A5, CHAR(10), " ", "ulAlarmLevel : ", D5, CHAR(10)," ", "bBo…

JavaEE-微服务-Vuex

Vuex 2.1 什么是Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 Vuex在组件之间共享数据。 2.2 使用 vue cli 构建项目 2.3 入门案例 2.3.1 定义数据 export default new Vuex.Store({state: { // 状态区域&#xff08;定义变量区域&#xff09;user: ,toke…

python学习笔记10(循环结构2)

&#xff08;一&#xff09;循环结构2 1、扩展模式 语法&#xff1a; for 循环变量 in 遍历对象&#xff1a; 语句块1 else: 语句块2 说明&#xff1a;else在循环结束后执行&#xff0c;通常和break和continue结合使用 2、无限循环while while 表达式&#xff1a; 语句块…

Ubuntu Desktop 隐藏 / 显示文件和文件夹

Ubuntu Desktop 隐藏 / 显示文件和文件夹 1. GUI hot key2. Show hidden and backup filesReferences 1. GUI hot key Ctrl H: 隐藏 / 显示文件和文件夹 2. Show hidden and backup files Edit -> Preferences -> Views References [1] Yongqiang Cheng, https://yo…

梳理Langchain-Chatchat知识库API接口

一.Langchain-Chatchat 知识库管理 1.Langchain-Chatchat 对话和知识库管理界面 Langchain-Chatchat v0.28 完整的界面截图&#xff0c;如下所示&#xff1a; 2.知识库中源文件和向量库 知识库 test 中源文件和向量库的位置&#xff0c;如下所示&#xff1a; 3.知识库表结构 k…

一夜暴增200城,智驾开城秘诀在哪?小鹏、理想、大疆等各有不同

作者 |Marshall 编辑 |祥威 一夜过后&#xff0c;城市NOA可用范围突然增至两百多城市&#xff0c;这是最近小鹏的智驾给大家的印象。 我们曾在「特斯拉、小鹏开路&#xff0c;城市NOA距好用还有几年&#xff1f;」一文中&#xff0c;探讨了城市NOA落地过程中所面临的地图问题…

vue3-组件基础

什么是组件 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行处理。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构。 定义一个组件 我们一般会将 Vue 组件定义在一个单独的 .vue 文件中&#xff0c;这被叫做单文件组件 (简称…

TypeScript 实用技巧(中)

十四、向类型添加特殊值 原文&#xff1a;exploringjs.com/tackling-ts/ch_special-values.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 14.1 在带内添加特殊值 14.1.1 向类型添加 null 或 undefined 14.1.2 向类型添加符号 14.2 在带外添加特殊值 14.2…

ES查询语法介绍及举例

1. ES查询语法 Elasticsearch&#xff08;ES&#xff09;的查询语法非常强大且灵活&#xff0c;允许执行从简单到复杂的各种搜索操作。ES查询主要基于两种类型&#xff1a;Leaf Query Clauses&#xff08;叶查询子句&#xff09;和Compound Query Clauses&#xff08;复合查询…