边学边记——Java数据结构☞树和二叉树

news2024/11/15 21:51:21

目录

一.树

1.定义

2.一些基本概念

3.树的表示形式

二.二叉树

1.概念

2.两种特殊的二叉树

 3.二叉树的性质

4.二叉树的存储

5.二叉树的遍历(The traversal of A binary Tree)


一.树

1.定义

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

它具有以下的特点:

  • 有一个特殊的结点,称为根结点,根结点没有前驱结点。
  • 除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti (1 <= i <=m) 又是一棵与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。
  • 树是递归定义的。
  • 子树之间无交集。

2.一些基本概念

  • 结点的度:一个结点含有子树的个数称为该结点的度。
  • 树的度:一棵树中,所有结点度的最大值称为树的度。
  • 叶子结点或终端结点:度为0的结点称为叶结点。(叶子结点:度==0,非叶子结点:度>0)
  • 树的结点={叶子结点+非叶子结点}。
  • 双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点。(根结点没有双亲)
  • 孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点。
  • 根结点:一棵树中,没有双亲结点的结点。
  • 结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推。
  • 树的高度或深度:树中结点的最大层次。

树的以下概念只需了解,在看书时只要知道是什么意思即可:

  • 非终端结点或分支结点:度不为0的结点。
  • 兄弟结点(sinling node):具有相同父结点的结点互称为兄弟结点。
  • 堂兄弟结点:双亲在同一层的结点互为堂兄弟。
  • 结点的祖先:从根到该结点所经分支上的所有结点。
  • 子孙:以某结点为根的子树中任一结点都称为该结点的子孙。
  • 森林:由m(m>=0)棵互不相交的树组成的集合称为森林。

3.树的表示形式

通常(没有特殊要求的)情况下,树经常用链式结构表示(结点)。

树结构相对线性表就比较复杂,要存储表示起来就比较麻烦,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。

这里就简单的了解其中最常用的孩子兄弟表示法

class Node {
    int value; // 树中存储的数据
    Node firstChild; // 第一个孩子引用
    Node nextBrother; // 下一个兄弟引用
}

二.二叉树

1.概念

二叉树(Binary Tree):最多只有两个子树的树型结构,有序树。

一棵二叉树是结点的一个有限集合,该集合:

  • 或者为空。
  • 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

注意:

  • 二叉树不存在度大于2的结点(值只有0,1,2)。
  • 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

对于任意的二叉树都是由以下几种情况复合而成的:

2.两种特殊的二叉树

(1). 满二叉树:

        一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵二叉树的层数为K,且结点总数是2^{k} - 1 ,则它就是满二叉树。

(2). 完全二叉树:

        完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。

注意: 

  • 要注意的是满二叉树是一种特殊的完全二叉树。
  • 按照层序在编号:给定一个结点的编号记为n,则该结点左孩子的编号为2 * n + 1,右孩子的编号为2 * n + 2。

 3.二叉树的性质

(1). 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有 (i>0)个结点。

(2). 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 (k>=0)

(3). 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1。

证明:一颗二叉树中,一共有n0个度为0的结点,n1个度为1的结点,n2个度为2的结点。由于二叉树中所有结点的度只能是0、1、2,所以整棵树的结点个数n = n0 + n1 + n2。

树中所有边数 m:

  • 度为0的结点:0条边
  • 度为1的结点:1条边
  • 度为2的结点:2条边

所以边数 m = 0 * n0 + 1 * n1 + 2 * n2。

边数 = 结点个数 + 1,即n = m + 1,所以可以得到 n0 + n1 + n2 = 0 * n0 + 1 * n1 + 2 * n2 + 1,化简得到 n0 = n2 + 1。

(4). 具有n个结点的完全二叉树的深度k为 log2(n + 1)向上取整(+1)(根据求结点个数的公式 n = 2^{k} - 1 反推)。 

(5). 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的结点有:

        若i>0,双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点;

        若2i+1<n,左孩子序号:2i+1,否则无左孩子;

        若2i+2<n,右孩子序号:2i+2,否则无右孩子。

4.二叉树的存储

二叉树的存储结构分为:顺序存储类似于链表的链式存储

        二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式,因为我们只关注二叉树的结点,而不关心二叉树本身,所以只写结点类,暂时没有树类。

如下:

// 孩子表示法
class Node {
    int val; // 数据域
    Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
    Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}


// 孩子双亲表示法
class Node {
    int val; // 数据域
    Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
    Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
    Node parent; // 当前节点的根节点
}

5.二叉树的遍历(The traversal of A binary Tree)

        遍历(traversal):将一个容器中(无论按照什么结果组织)所有元素,按照一定的顺序,要求每个元素都必须经历一次,并且只经历一次。

        隐含:哪个元素在前,哪个元素在后 -> 线性结构。

                   即:二叉树(非线性)-> 遍历(线性)。

(1). 分类:

a. 深度优先的遍历:

  • NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点--->根的左子树--->根的右子树。
  • LNR:中序遍历(Inorder Traversal)——根的左子树--->根节点--->根的右子树
  • LRN:后序遍历(Postorder Traversal)——根的左子树--->根的右子树--->根节点

b. 广度优先的遍历:

  • 层序遍历:设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

如有建议或想法,欢迎一起讨论学习~ 

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

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

相关文章

1676_MIT 6.828 xv6中的CPU alarm_资料翻译整理

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 我觉得看了几个MIT的课程之后让我觉得我的大学四年有点浪费时光&#xff0c;看起来MIT的课程的确是很有饱满度。 这里&#xff0c;再整理一份课程中的作业要求。 …

每天分享五款工具,让你的工作办公更顺心

快乐不是在于拥有什么,而在于我们和别人分享什么。每天分享五款工具&#xff0c;让大家工作办公更顺心就是我最大的快乐。 1.绘画——Krita Krita是一款免费的开源绘画软件&#xff0c;适合专业和业余的绘画爱好者&#xff0c;支持多种画笔和图层。你可以使用Krita来创作各种…

HTTP与TCP区别

1、TCP对应与传输层、而HTTP对应于应用层&#xff0c;所以HTTP协议是建立在TCP协议之上的&#xff1b; 2、HTTP底层是利用TCP协议传输的&#xff0c;所以支持http也就一定支持TCP&#xff1b; 3、TCP是网络传输协议&#xff0c; HTTP是超文本传输协议&#xff1b; TCP是底层协…

Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例

场景 Java中创建线程的方式有三种 1、通过继承Thread类来创建线程 定义一个线程类使其继承Thread类&#xff0c;并重写其中的run方法&#xff0c;run方法内部就是线程要完成的任务&#xff0c; 因此run方法也被称为执行体&#xff0c;使用start方法来启动线程。 2、通过实…

盘点手机Type-c充电接口5个实用功能

目录 1、手机通过Type-c转HDMI&#xff0c;高清输出电视 2、通过OTG Type-c扩展手机功能 3、实现手机通过网卡有线上网 4、电脑通过手机Type-C有线上网 5、手机通过Type-C收听高清音频 今天给大家聊聊手机Type-c充电接口的5个实用功能&#xff0c;希望对大家日常使用…

Java每日一练(20230410)

目录 1. 二叉树的锯齿形层序遍历 &#x1f31f;&#x1f31f; 2. 从中序与后序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 3. 平衡二叉树 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专…

UE4 Niagara 烟花制作工程

效果图&#xff1a; 第一个做的是网上射出的粒子&#xff1a; 用了事件&#xff0c;把ID给启用&#xff0c;不然会报错 第一个发射的炮弹粒子制作完成 第二制作炮弹的拖尾&#xff1a; 很明显会用到Ribbon 让宽度从宽到窄 让位置和颜色与第一个做的粒子一致&#xff0c;所以…

【分享】集简云审批支付助手,实现OA付款单自动到招商银行支付

场景描述 支付管理是企业财务管理中的重要一环&#xff0c;直接涉及企业现金流的管理和资金的运用。 在现代商业环境下&#xff0c;企业支付管理越来越复杂&#xff0c;许多公司都存在支付流程不规范、支付环节复杂的问题&#xff0c;导致企业支付效率低下。一方面&#xff0…

CocosCreator实战篇 |CocosCreator实现《飞机大战》

&#x1f4e2;博客主页&#xff1a;肩匣与橘 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649; &#x1f4e2;生活依旧是美好而又温柔的&#xff0c;你也…

论文赏析——约翰·科斯塔斯:线性系统编码

© 1952 J. P. Costas © 2023 Conmajia 作者简介 约翰彼得科斯塔斯&#xff08;1923-2008&#xff09;&#xff0c;美国电气工程师&#xff0c;曾发明科斯塔斯环和科斯塔斯数组。科斯塔斯参加过第二次世界大战&#xff0c;并在战后进入麻省理工学院攻读博士学位&#…

Java反序列化漏洞及实例详解

目录 一、序列化和反序列化 序列化 用途 二、Java反序列化漏洞 数据出现 函数接口 漏洞发现 漏洞利用 三、Java序列化反序列化演示 四、靶场演示 一、序列化和反序列化 序列化 把 Java 对象转换为字节序列&#xff08;字节流&#xff09;的过程。 反序列化 把字节序…

WebRTC 系列(一、简介)

一、什么是 WebRTC WebRTC 全称是 Web RealTime Communication&#xff0c;是一个用于实时通讯的技术&#xff0c;Google 公司在 2010 年用 6829 万美元将其从 Global IP Solutions 公司收购&#xff0c;并于 2011 年开源&#xff0c;不得不说 Google 确实是一家伟大的公司&am…

uniapp 引入插件市场的echart插件,使用指南!+踩坑记录!!血泪史!!!

此文章适用于微信小程序中&#xff0c;在uniapp做的小程序中使用echarts 插件地址&#xff1a;echarts-for-wx - DCloud 插件市场 插件网页往下翻有详细的使用步骤&#xff0c;这里简短的贴上几张图片 以下是我 项目中的使用情况&#xff0c;分享给大家&#xff1a; 1.一键导…

网关和spring cloud网关技术Gateway

文章目录一、网关1.1 网关是什么1.2 API网关的作用二、Spring Cloud Gateway2.1 简介2.2 搭建步骤2.3 路由断言工厂2.3.1 什么是路由断言工厂2.3.2 Spring Cloud Gateway提供的11 种断言工厂2.4 网关过滤器2.4.1 介绍2.4.2 网关过滤器作用2.4.3 过滤器配置2.4.4 全局过滤器Glob…

【STM32学习】模数转换器——ADC

【STM32学习】模数转换器——ADC零、参考一、ADC转换耗时二、转换模式三、对某些寄存器的理解1、ADC_CR22、ADC_SQRX四、库函数注意事项零、参考 STM32固件库&#xff08;标准外设库&#xff09;入门学习 第七章 ADC数模转换&#xff08;一&#xff09; 刘凯&#xff1a;STM32…

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

0. 引言 在开发周期较长&#xff0c;或者需求变更频繁&#xff0c;涉及多版本发布的项目中&#xff0c;我们常常遇到这样的问题&#xff1a; 改了表结构&#xff0c;开发环境执行了&#xff0c;忘记保存&#xff0c;发测试、生产环境时又要重写一遍DDL多人开发&#xff0c;都…

ChatGPT如何应用在数据治理的具体场景中?

自从ChatGPT爆火以来&#xff0c;技术圈的爆炸新闻是一波接一波&#xff0c;让人目不暇接&#xff0c;突然有了一种“人间一日&#xff0c;AI一年的感觉”。上周就有几条重磅新闻&#xff0c;来跟大家分享一下&#xff1a; New Bing 对所有用户放开&#xff0c;注册即可用周三…

每个企业经营者都应该了解的几个网络安全趋势

每个企业主都应了解的一些网络安全趋势&#xff1a; 1. 对实时数据可见性的需求增加 根据 IBM 发布的调查数据&#xff0c;企业发现并遏制漏洞的平均时间为 277 天。这种漏洞得不到解决的时间越长&#xff0c;泄露的数据就越多。这反过来会对您的业务产生更大的影响。企业需要…

【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

蓝桥杯0基础学习

目录 Split()分隔字符串 StringBuilder用法 反转字符串中的单词 LocalDate用法 LocalDate类具体方法 查询年月日 修改时间 判断日期先后&#xff0c;是否是闰年&#xff0c;月份年份长度 对时间进行加减操作 跑步锻炼 使用LoaclDate解法 没使用LocalDate解法 next()…