--- 数据结构 二叉树 --- java

news2024/11/23 9:19:12

树形结构

数使一个非线性结构,他是由n个结点组成的具有一定层次关系的集合,叫做树是因为他像是一颗倒挂的树,根在上,叶子在下,具有一些性质

1,有一个特殊节点叫做根节点,他没有钱去节点(向上没有节点)

2,除开根节点外,其他的节点被分成n个互不相交的集合,每个集合的根节点只有一个前驱,但是可以有0个或者多个后驱

3,树使递归定义的

在树形结构中不能存在一个子节点被俩个根节点连接的情况,也就是一个节点只能有一个前驱

树的概念

节点的度:是一个节点所连接子树的数量,对a来说,他连接了6个字数所以他的度为6

树的度:一棵树的度的最大值 这里最大的度为a所以树的度为6

叶子节点或终端节点:该结点的度为0,这里b,c,h,i...都是叶子

双亲节点或者是父节点:该节点对应的前驱,b的父节点就是a,根节点没有父节点

孩子节点或者是子节点:该节点对应的后驱节点称为其的子节点,如图b是a的子节点

根节点:一个树中没有父节点的节点,也就是a

节点的层数:从节点开始,将根节点记为第一层,根的子节点就是第二层这样以此类推,这里h在第三层

树的高度和深度:书中节点的最大层数,p所在就是最大层数4层,所以树的高度为4

---了解

非终端节点或分支节点:度不为0的节点,a,d,e...都是非终端节点

兄弟节点:有同一个父节点的节点互称为兄弟节点

堂兄弟节点:节点的夫节点在同一层,那么这写节点互称为堂兄弟节点

节点的祖先:每个分支最终向上直线的点,也就是根节点 a

子孙:以某节点为根的树的所有子节点都可以被称为该节点的子孙,这里所有的节点都是a的子孙

森林:有m棵不同相交的树组成的集合为森林

二叉树

二叉树一个父节点最多有俩个子节点,left和right

一个二叉树的度不能超过2,且他的子树有左右之分不能颠倒,所以二叉有序树

对于二叉树,只要是树的度不超过2那么就是二叉树

俩种特殊的二叉树

满二叉树

一个二叉树他的每层的节点的节点数都达到最大值,那么这个树就是满二叉树,那么就有如果一个满二叉树的层数为k,那么他的节点数就是(2^k)-1

完全二叉树

又满二叉树引出来的,是一种效率很高的数,对于有k层n个节点的完全二叉树,他的节点对应的编号和深度为k的满二叉树对应的编号一一对应,这样称为完全二叉树

这样的不能称为是完全二叉树

二叉树的性质

1. 若规定根节点的层数为1,那么第i层最多能储存的节点个数为2^(i-1)

2. 若根节点的层数为1,那么深度为k的二叉树最多能储存的节点的个数为(2^k)-1

3. 对于任意一颗二叉树,若他的叶子节点的个数为n0,度为2的节点个数为n2 那么就与

n0 = n2 +1

4. 具有n个节点的二叉树的深度为 log(n+1)向上取整,也就是若n为510个 log511向上取整为521

对2去对数也就是9层

5. 对于具有n个节点的二叉树,若按上到下,从左到右一次编号,对与编号为i的节点就有

若 i > 0,双亲序号(父节点)i / 2,i = 0 为根节点,无父结点

若2i +1 < n,i 对应的左孩子序号为2i + 1,否者无左孩子

若2i + 1 < n,i 对饮的右孩子序号为2i + 2,否者无右孩子        

二叉树的代码实现

二叉树的链式储存有俩种

孩子表示法

孩子双亲表示法

二叉树的基本操作

二叉树的遍历

前序遍历 preOrder

先打印根节点 --> 左节点 -->  右节点

代码实现

该遍历是先往左一直走,直到走到了null,然后右走到左节点,可以使用递归的思想,先向左一直递归,直到null返回,这是左边就走完了,这时再退到4这个节点,再走到4这个节点的右边,这时又是空那么这时这个4这个方法也就走完了,那么这时递归也就退到了2这个节点,然后走到这个节点的右节点,就这样前序遍历就设计出来了

中序遍历

先打印左节点 --> 根节点 --> 右节点

中序遍历也就是再吧左节点走完了才去打印左节点4,然后走到右节点null,退出,递归回退到了2

这时走到2的右节点5,5的做节点为空,打印5,再走到5的右节点null,回退到了3这样递归下去

后序遍历 postOrder

先打印左节点 --> 右节点 --> 根节点  也就时要把左右节点都走完,这时才能打印,4这个节点的左右null都走完,然后回退打印4,回退到2,走到2的右节点5,5的左右节点null走完,打印5

回退到2 打印2 这样递归

获取二叉树的高度 getHeight

二叉树的高度是一条最长的链

这次需要比较每个节点的左右高度

先递节点的左右节点,节点1左右节点2 3,都是先递归左边,递到2 的左右节点 4 5,4 的左右节点null 返回0,这时4这个节点就算是递归完了,返回1再递到5的左右节点 null 81 ,81 的左右节点 null 8,8的左右节点null 这时8递归完了,返回1,接着81也递归完了返回2(1+1),因为需要加上每次返回的值

接着5也递归完了,返回会3,这时4返回的是1,5返回的是3,5节点返回的值大于4节点,最终2的返回值也即是5节点的值加一4 ,这样树的递归也就写出来了

找到某个数是否存在 find

建立的二叉树是无序的那么秩序要前序遍历每个节点找到对应的节点就可以了

获得的叶子个数 getLeafCount

创建一个全局变量LeafCount记录叶子的个数,然后再遍历整棵树,如果该节点的左右都为空,那么leafCount++,最后遍历完了就返回leafCount,和前序遍历大差不差

每个节点遍历了都要判断所以需要写俩次比较

END

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

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

相关文章

017_Python爬虫系列_防盗链代理

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

限流,流量整形算法

写在前面 本文看下流量整形相关算法。 目前流量整形算法主要有三种&#xff0c;计数器&#xff0c;漏桶&#xff0c;令牌桶。分别看下咯&#xff01; 1&#xff1a;计数器 1.1&#xff1a;描述 单位时间内只允许指定数量的请求&#xff0c;如果是时间区间内超过指定数量&a…

用Python实现时间序列模型实战——Day 17: 时间序列模型的评估方法

一、学习内容 1. 预测误差的评估指标 在时间序列预测中&#xff0c;常用的评估指标包括 MAE (Mean Absolute Error), MSE (Mean Squared Error) 和 RMSE (Root Mean Squared Error)。这些指标用于衡量模型的预测误差。 MAE (Mean Absolute Error)&#xff1a; MAE 衡量预测值…

mysql学习教程,从入门到精通,MySQL WHERE 子句(10)

1、SQL WHERE 子句 在本教程中&#xff0c;您将学习如何使用SQL从表中选择特定记录。 根据条件选择记录 在上一章中&#xff0c;我们学习了如何从表或表列中获取所有记录。但是&#xff0c;在现实世界中&#xff0c;我们通常只需要选择&#xff0c;更新或删除满足某些条件的那…

HarmonyOS---应用测试概述

一、应用质量要求 应用质量要求分为应用体验质量建议和应用内容合规要求两大部分。 1、应用体验质量建议 功能数据完备、基础体验要求、HarmonyOS特征增强体验要求。 &#xff08;1&#xff09;功能数据完备 &#xff08;2&#xff09;基础体验要求 &#xff08;3&#xff09;增…

盘古信息IMS 驱动智能工厂建设,助力制造企业降本增效

随着全球化的加剧和市场竞争的日益激烈&#xff0c;制造业面临着提高生产效率、降低成本、提升产品质量以及实现绿色可持续发展等多重压力。智能工厂是利用人工智能、大数据、物联网、云计算等新技术&#xff0c;实现工厂的智能化、自动化、可持续化发展的新型制造业模式&#…

《深度学习》OpenCV 高阶 图像直方图、掩码图像 参数解析及案例实现

目录 一、图像直方图 1、什么是图像直方图 2、作用 1&#xff09;分析图像的亮度分布 2&#xff09;判断图像的对比度 3&#xff09;检测图像的亮度和色彩偏移 4&#xff09;图像增强和调整 5&#xff09;阈值分割 3、举例 二、直方图用法 1、函数用法 2、参数解析…

芋道快速开发平台的使用心得

1.前端版本 项目的管理后台有 4 个版本&#xff1a; yudao-ui-admin-vue3 (opens new window)&#xff1a;基于 Vue3 element-plus yudao-ui-admin-vben (opens new window)&#xff1a;基于 Vue3 vben(ant-design-vue) yudao-ui-admin-vue2 (opens new window)&#xff…

LaTeX中制作表格【表格数据自动换行】(附latex源码)

一、latex软件推荐 在使用LaTeX进行文档编写时&#xff0c;有几款非常受欢迎且功能强大的软件和在线编辑器可供选择。以下是一些推荐的LaTeX软件&#xff1a; 1. Overleaf(强烈推荐) Your Projects - Overleaf, Online LaTeX Editorhttps://www.overleaf.com/project 2.Tex…

图新说【消防】(一步步的做好态势标绘)

0.序 越来越多的消防战士使用图新说来做消防预案&#xff0c;态势标绘比武等。 图新说即可应用于具体的消防救援任务&#xff0c;制作具体的作战方案&#xff0c;让战士的配合更加紧密。 也可以做大型的消防预案&#xff0c;针对辖区内的重点建筑、危化存储区提前做应急救援方…

最新版MYMPay码支付开源版系统源码_个人免签支付_聚合支付系统

最新版MYMPay码支付开源版系统源码_个人免签支付_聚合支付系统 安装环境&#xff1a; PHP&#xff1a;7.0-8.2 (推荐使用7.4) 需要安装Xload 扩展 MySQL&#xff1a;5.6版本 访问 http://你的域名/install 进行安装 后台地址&#xff1a;http://你的域名/Admin/ 账号&am…

C++笔记之map的实用操作

C++笔记之map的实用操作 文章目录 C++笔记之map的实用操作1.初始化1.1.使用列表初始化1.2.使用 `insert` 方法1.3.使用 `emplace` 方法1.4.复制构造1.5.移动构造2.赋值2.1.列表赋值2.2.插入元素2.3.批量插入3.取值3.1.使用 `[]` 操作符3.2.使用 `at()` 方法3.3.检查键是否存在3…

C++设计模式——State状态模式

一&#xff0c;状态模式的定义 状态模式是一种行为型设计模式&#xff0c;状态模式允许对象在内部状态发生切换时改变它自身的行为。 状态模式的主要目的是将复杂的状态切换逻辑抽象化为一组离散的状态类&#xff0c;使代码结构更加清晰和易于维护。 状态模式将对象的行为封…

【spring】IDEA 新建一个spring boot 项目

参考新建项目-sprintboot 选择版本、依赖,我选了一堆 maven会重新下载一次么?

Vue(8)——v-model原理

v-model 原理:v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是value和input事件的合写。 作用&#xff1a;提供数据的双向绑定。 数据变&#xff0c;视图跟着变 :value视图变&#xff0c;数据跟着变 input <template><div><input v-model&quo…

【智能体】浅谈大模型之AI Agent

随着ChatGPT推出插件和函数调用功能&#xff0c;构建以LLM&#xff08;大语言模型&#xff09;为核心控制器的AI Agent愈发成为一个拥有无限可能的概念。 AI Agent是一种超越简单文本生成的人工智能系统。它使用大型语言模型&#xff08;LLM&#xff09;作为其核心计算引擎&am…

如何将JSON字符串里面的某个字段的json字符串格式转成json对象?

目录标题 背景临时方案最好的方案 背景 下游传过来的数据是一个json字符串&#xff0c;这个json字符串里面有的字段又套着json字符串&#xff01;还有一些字段直接是null传过来的&#xff01;现在要去掉null&#xff0c;且将一些json字符串&#xff01;尽可能的换成json对象&a…

UE4_后期处理_后期处理材质及后期处理体积一

后期处理效果 在渲染之前应用于整个渲染场景的效果。 后期处理效果&#xff08;Post-processing effect&#xff09;使美术师和设计师能够对影响颜色、色调映射、光照的属性和功能进行组合选择&#xff0c;从而定义场景的整体外观。要访问这些功能&#xff0c;可以将一种称为…

[转]什么是工作流,flowable 与 Activiti对比

工作流 什么是工作流工作流是复杂版本的状态机Java工作流开源框架工作流对比 Activiti 设计器Flowable 兼容性Camunda 设计器兼容性&#xff1a;小结&#xff1a;社区活跃度 FlowableActivitiCamunda总结 什么是工作流 工作流&#xff0c;是指“业务​过程的部分或整体在​计算…

面试题:try和finally中都出现了return语句会发生什么情况

答&#xff1a;会导致提前返回&#xff0c;即执行finally中的return语句&#xff0c;try中的return语句不会被执行。 原因&#xff1a;当try中有return语句时&#xff0c;会延迟返回&#xff0c;即先执行完finally的代码&#xff0c;再执行try的return语句&#xff0c;这样做的…