Java初阶数据结构二叉树实现+练习完整(工程文件后序会进行上传)

i1.二叉树的概念

1.二叉树的定义

(1)二叉树可以是一个节点的有限集合

(2)可以为空

(3)或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成的

(4)二叉树的每一个节点都是小于等于2的。

(5)二叉树的子树是有左右之分的,分别为左树和右树

2.二叉树的组成

(1)首先数据结构分为线性结构和树状结构,其中二叉树就是一个树状结构的数据结构,他是由多个节点组成的

(2)一个二叉树是由一个根结点以及多个子树来组成的。

(3)二叉树的代码实现原理图(代码逻辑)

都指向他的堂兄弟节点,如果没有堂兄弟节点那么就遍历他的该节点的左子树然后再看这个左子树有没有堂兄弟节点

2.二叉树节点名称

结点的度:一个结点含有子树的个数称为该结点的度; 如上图:A的度为6 树的度:一棵树中,所有结点度的最大值称为树的度;

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

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

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

根结点:一棵树中,没有双亲结点的结点;如上图:A 结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推

 树的高度或深度:树中结点的最大层次; 如上图:树的高度为4 树的以下概念只需了解,在看书时只要知道是什么意思即可:

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

兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点 堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点 结点的祖先:从根到该结点所经分支上的所有结点;

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

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

3.二叉树的两个特殊种类

3.1满二叉树(特殊的完全二叉树)

2^(k-1)是他这一层的节点数

k是层数

2^k-1 总节点数就是

3.2完全二叉树

定义:从上到下,从左到右依次存放就是完全二叉树,我搞编号(编号七没了自己想象)了方便大家更好理解

满二叉树是一个特殊的完全二叉树

4.二叉树的性质

4.1二叉树性质的解析

 度指的就是这个节点的两边有几个。

扩容知识

(1)一颗N个节点的树中有N-1个边

  (2)具有n个结点的完全二叉树的深度k为log2(n+1)取整

(3)节点编号减一除二得到父亲节点编号(n是总节点数)

左孩子2i+1

有孩子2i+2

等于n就代表这个孩子节点没有

4.2二叉树性质的习题解析

1.题目一

2.题目二 

3. 题目三

在完全二叉树中度为2的节点和度为1的节点永远是2比1多1个节点,

节点数偶数有度为1的节点为1个,所以只剩下度为0和2的+1.

节点数为奇数没有度为1的节点

 5二叉树如果进行存储

5.1.二叉树的链式存储

5.1.1二叉树链式存储的方式介绍

(1)链表存储是用一个节点一个节点来引用起来的,常见的有二叉和三叉表示方式

(2)双孩子双亲表示法就是红黑树那些,我们会在高级数据结构中进行讲解 

我们的初级数据结构中使用的就是孩子表示法

5.2 二叉树链表式存储实现(孩子表示法)

代码实现

定义三个类

测试类

节点类

二叉树类

(1)这三个类会整体实现这个二叉树

(2)定义一个一般的二叉树的节点类型

(3)接下来我会用穷举的方法来实现二叉树,因为不这样搞你们看不懂

图解 

 我会定义这些节点然后用手动的方式拼接起来。

拼接完毕以后 ,我们要考虑的就是输出这个树,所以我们要找到根然后返回A根节点

之后我们在测试了Frank中来实例化这个对象,然后来输出这个二叉树。

这时候打断点进行测试 可以发现没啥问题

6.二叉树习题(让你更好了解二叉树)

6.1.前情提要

(1)二叉树有4种遍历方式(自己blibli上面看看视频,我要写太多了而且我写了你们也看不懂还是视频比较好)

前序遍历 根左右

中序遍历 左根右

后续遍历 左右根

层序遍历一层一层遍历从上到下从左到右

6.2二叉树习题讲解

(1)后续遍历前序遍历都可以得到根是哪一个,再推导出来中序遍历

 6.3.通过代码实现二叉树

     实现前序中序后序三种遍历方式

 6.3.1前序遍历的实现

先根然后遍历左边的所有树,再遍历右边的所有数。

每次遍历完往下面走就将其当成一个完整的树进行遍历

代码实现

递归左边然后右边就前序遍历完成了。 

图解

6.3.2中序遍历的实现 

代码实现

图解

 6.3.3后序遍历的实现

图解

代码实现

7.二叉树的具体实现

7.1获取树中节点总数(正常思路和子问题思路)

正常思路

 代码实现

子问题思路

大家会疑惑再size2中为什么tmp可以等于这个东西它是如何计算的?

我们通过图解来给大家讲解

图解:

 7.2获取二叉树的叶子节数方法(正常思路和子问题思路)

正常思路:

总体原理:进行递归然后当左右递归都为null 就是叶子节点(左子树的叶子加上右子树的叶子)

两种思路自己看一下

 正常思路

子问题思路 (总节点个数等于左子树节点个数+右子树节点个数+root)

0 + 0 =1!!!!!!!!!!!

图解思路

 7.3求第k层节点的个数

子问题思路:k层的左右相加在向上递归最后加起来总和就可以了

 所以我们要先求左树的高度然后再求右树的高度然后进行比较再加一就可以了

图解(递归图解)

代码思路

 图解

还有三目运算符也是可以的:自己写一下我喜欢用max

7.4查找这个元素在二叉树中是否存在

这个方法本身不会抛出异常,但是运行的时候由于我们return了一个null在结尾的时候,这时候就会发生空指针异常,所以在使用的时候要用try catch语句进行包裹来抛出异常

遍历整个二叉树,然后找到这个节点输出

子问题思路:

(1)根节点是不是要找的数据

(2)去左子树找再去右子树找

(3)如果root的val不等于你找的val就ruturn null找到了就return true

图解

代码实现 

代码思路ctrl加鼠标滚轮方法自己看

 

7.5 层序遍历(后序补充,看到这里去看二叉树练习)

7.6判断一棵树是不是完全二叉树(后序补充,看到这里去看二叉树的练习)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣细节题:字符串中的最大奇数

奇数只要找到第一位是奇数的即可,不是找单个数字 //即从最低位开始,找到第一位为奇数的位 //然后之前的就是需要的数字char * largestOddNumber(char * num){int i strlen(num) - 1;while(i > 0){if((num[i] - 0) % 2 1)break;i--;}//先找到低位开…

电子科技大学链时代工作室招新题C语言部分---题号E

1. 题目 这道题大概的意思是说,一座城市中被埋了许多雷(用一个只含0和1的字符串表示城市,1代表有雷,0代表无雷)。 你作为一个排雷兵,需要花最少的钱引爆所有的雷来使城市中不再有雷(太逆天了&a…

Java宝典-异常

目录 1. 异常的分类1.1 运行时异常1.2 编译时异常 2. 异常的抛出2.1 throw2.2 throws 3. 异常的捕获3.1 try-catch3.2 finally 4. 异常执行的过程5. 自定义异常 在Java中,异常(Exception)是指程序发生不正常的行为,异常其实就是一个一个的类。 1. 异常的…

c++刷题(自用)(问题合集)---(一直会更)

初始化列表易错点 #include <iostream> using namespace std;struct A {A() { std::cout << "A"; } }; struct B {B() { std::cout << "B"; } };class C { public:C() : a(), b(){std::cout << "C";}private:B b;A a; …

【AcWing】蓝桥杯集训每日一题Day5|归并排序|离散化|二分|逆序数对|505.火柴排队(C++)

火柴排队 505. 火柴排队 - AcWing题库难度&#xff1a;中等时/空限制&#xff1a;1s / 128MB总通过数&#xff1a;2058总尝试数&#xff1a;4484来源&#xff1a;NOIP2013提高组算法标签贪心离散化树状数组归并排序 题目内容 涵涵有两盒火柴&#xff0c;每盒装有 n 根火柴…

基于Pnpm + Turborepo + QianKun的微前端+Monorepo实践

基于Pnpm Turborepo QianKun的微前端Monorepo实践 背景 微前端一般都会涉及多个代码库&#xff0c;很多时候要一个一个代码库地去开发维护和运行&#xff0c;很不方便&#xff0c;这种时候引入Monorepo搭配微前端就能很好地解决这种问题&#xff0c;一个代码库就可以完成整…

AI赋能写作:AI大模型高效写作一本通

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

文件包含例子

一、常见的文件包含函数 php中常见的文件包含函数有以下四种&#xff1a; include() require() include_once() require()_once() include与require基本是相同的&#xff0c;除了错误处理方面: include()&#xff0c;只生成警告&#xff08;E_WARNING&#xff09;&#x…

linux之source.list解析

众所周知&#xff0c;linux可以通过apt命令安装软件&#xff0c;那么apt又是从哪里获取软件包呢并安装呢&#xff1f;这里就绕不开一个文件source.list&#xff0c;该文件定义了软件源相关的信息。下面以实际例子&#xff0c;详细的介绍下这个文件。 文件作用 定义软件源的信…

MySQL-HMA 高可用故障切换

本章内容&#xff1a; 了解MySQL MHA搭建MySQL MHAMySQL MHA故障切换 1.案例分析 1.1.1案例概述 目前 MySQL 已经成为市场上主流数据库之一&#xff0c;考虑到业务的重要性&#xff0c;MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展&#xff0c;MHA…

【C++庖丁解牛】List容器的介绍及使用 | 深度剖析 | list与vector的对比

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. list的介绍1.1 list的…

每周一算法:双向深搜

题目描述 达达帮翰翰给女生送礼物&#xff0c;翰翰一共准备了 N N N 个礼物&#xff0c;其中第 i i i 个礼物的重量是 G [ i ] G[i] G[i]。 达达的力气很大&#xff0c;他一次可以搬动重量之和不超过 W W W的任意多个物品。 达达希望一次搬掉尽量重的一些物品&#xff0c;请…

冲动是魔鬼,工作不顺心时不要把坏脾气带给家人

今天与一个跟踪了很久的客户准备签合同了&#xff0c;客户突然反悔&#xff0c;为此与他周旋了一整天&#xff0c;忙碌得一口水都没有喝。回到小区坐在车里抽着烟&#xff0c;久久不愿回家&#xff0c;只想一个人坐着&#xff0c;疲惫、无奈。这个月的奖金似乎又将成为泡影。 …

mov格式视频怎么做二维码?视频在线做二维码的方法

如何将mov格式视频转二维码以后分享呢&#xff1f;视频二维码是现在手机获取视频内容很常用的一种方式&#xff0c;通过二维码生成器工具就可以快速在线生成二维码图片&#xff0c;使用手机扫码就可以播放视频。但是视频的格式有很多种&#xff0c;当我们需要将mov格式的视频生…

网络安全——关于防火墙

网络安全防火墙是很重要的部分&#xff0c;关于防火墙我们要知道&#xff0c;他默认所有流量都是黑名单&#xff0c;只有开启允许通过才可以。 我们通过一个实验来学防火墙命令。 防火墙要登录才能使用&#xff0c;用户名是admin,默认密码是Admin123&#xff0c;在第一次登录…

Spring AI Chat 简单示例

官方文档地址&#xff1a; https://docs.spring.io/spring-ai/reference/index.html Spring AI 可以方便 Java 开发者在代码中集成 AI 的功能&#xff0c;通过 Spring 提供的抽象&#xff0c;可以方便的切换不同的AI提供商&#xff0c;Spring AI 是对 AI 的使用&#xff0c;并…

Android 地图SDK 绘制点 删除 指定

问题 Android 地图SDK 删除指定绘制点 详细问题 笔者进行Android 项目开发&#xff0c;对于已标记的绘制点&#xff0c;提供撤回按钮&#xff0c;即删除绘制点&#xff0c;如何实现。 解决方案 新增绘制点 private List<Marker> markerList new ArrayList<>…

没有公式,不要代码,让你理解 RCNN:目标检测中的区域卷积神经网络

⭐️ 导言 在计算机视觉领域&#xff0c;目标检测是一项关键任务&#xff0c;它涉及识别图像中感兴趣的物体&#xff0c;并定位它们的位置。而RCNN&#xff08;Region-based Convolutional Neural Network&#xff09;是一种经典的目标检测算法&#xff0c;它以区域为基础进行…

BMP280 arduino调试

终于成功了。 #include <SPI.h> //定义数据类型 #define s32_t long signed int #define u32_t long unsigned int #define u16_t unsigned short #define s16_t signed short // 定义从设备选择引脚 const int chipSelectPin 10; //定义BMP280寄存器/// unsigned int …

R语言:如何基于地球外辐射(Ra)和相对日照(n/N)计算太阳辐射Rs?

正在编写相关软著&#xff0c;借此机会了解R语言的基本语法和一些处理流程&#xff0c;所以解释稍微繁琐。 Note&#xff1a; 使用的R语言版本是 R version 4.3.2 (2023-10-31 ucrt) 使用的RStudio编辑器版本是&#xff1a; 01 基于随机森林的插值填补缺失值 这是目前处理…