数据结构:树(Tree)

树型结构

树的概念

树是一种非线性结构,他是由n(n>=0)个有限结点组成的一个具有层次关系的集合。 当n=0时,该树为空树。 在任意一个非空树中都满足以下条件:
1、有一个特殊的结点,称为根结点,根结点没有前驱结点
2、当n>1时,其他结点可分为M(M>0)个互不相交的有限集T1,T2,T3.……、Tm,其中每个集合本身又是一棵与树类似的子树,每个子树的根结点有且只有一个前驱结点,后继结点可以有n个或多个。
3、树是递归定义的,树离不开递归。
4、在n个结点的树中有n-1条边。

树的一些基本特点 和术语

在这里插入图片描述
如图 树型结构中,子树之间不能有交集 否则就不是树型结构
通过上面那张图可以看出树的一些基本概念

结点的度:一个结点含有子树的个数称为该节点的度;通过上图 :A结点的度为3.
树的度:一棵树中,所有结点度的最大值称为树的度;如上图:树的度为3.
叶子结点或终端结点:度为0的结点称为叶子结点;如上图:J、F、K、L、H、I结点是叶子结点。
双亲结点或父结点:若一个结点含有子节点,则这个结点称为其子节点的父结点;如上图:A是B、C、D的双亲结点。
孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;如上图:B、C、D结点是A结点的子节点。
根结点:一棵树中没有双亲结点的结点;如上图:A结点是树的根结点。
结点的层次:从根开始定义起,根为第一层,根的子节点为第二层,以此类推下去。
树的高度:树中结点的最大层次;如上图:树的高度为 4 。
以上就是树的一些重要的概念 下面还有一些需要我们去了解一下的概念。
非终端结点或分支结点:度不为0的结点;如上图:B、C、D等结点为分支结点。
兄弟结点:具有相同父节点的结点称为兄弟结点;如上图:B、C、D是兄弟结点;
堂兄弟结点:双亲在同一层的结点互为堂兄弟;
森林:由m(m>=0)棵互不相交的树组成的集合称为森林。
还有就是结点的深度和高度的区别
结点的深度是从根结点开始自顶向下逐层累加的。
结点的高度则是从叶子结点开始自底向上逐层累加的。
最后一点 树也分为有序树无序树
如果该树的各个结点都是从左到右是有次序的,不能互换 ;则称为有序树,否则是无序树。如果是有序树,若将子结点位置互换,则会变成一棵不同的树。

至此 兄弟们 应该了解树的一些基本结构和专业名词了吧!且一定要记住树是非线性的 且树离不开递归
接下来我们开始树的相关性质的学习

树的性质

1、度为m的树中第i层上至多有m的(i-1)次方个结点
2、树中的结点数等于所有结点的度数加1

树的表示形式

树有很多表示方式:孩子双亲表示法,双亲表示法,孩子表示法,孩子兄弟表示法等
我们可以简单了解一下最常用的一种表示方法:孩子兄弟表示法
任何一棵树,他的结点的第一个孩子都是唯一的,他的右兄弟如果存在也是唯一的
所以有这种结点结构:
在这里插入图片描述

public class Tree {int value;  //存储的数据Tree firstChild;  //第一个孩子Tree nextBrother;//下一个兄弟
}

这就让我们想到二叉树 一种神奇的树

再此之后还有一种树值得我们去深入探究——那便是二叉树

二叉树

二叉树的定义

二叉树也是一种树型结构,他的每个结点至多有2个子树(二叉树中不能存在度大于2的结点),其子树有左右之分 不能调换 这是有序树。

二叉树和树相似 都离不开递归。
空树也是二叉树
以下就是二叉树的5种基本形态如图所示:
在这里插入图片描述

特殊的二叉树

1、满二叉树:一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。如下图:
在这里插入图片描述
2、完全二叉树:完全二叉树是一种效率很高的数据结构。一个高度为h,n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号从0~n-1的结点一一对应则称为完全二叉树 。相信火眼精金的朋友们也发现了满二叉树是一种特殊的完全二叉树
完全二叉树如图所示:
在这里插入图片描述
重点:完全二叉树度为1 的结点个数只能是1或者0。
3、二叉排序树
二叉排序树的定义为:左子树上的所有结点的关键字均小于根节点的关键字;右子树的所有结点的关键字均大于根结点的关键字。左子树和右子树也是一棵二叉排序树。
4、平衡二叉树
任意结点的左子树和右子树的深度之差不能超过1.

二叉树的性质

1、若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)(i>0)个结点。
2、若规定只有根节点的二叉树的深度为1,则深度为K的二叉树最大结点数为:2^K -1(K>=0)
3、对于任意一棵二叉树,如果其叶子结点个数为n0,度为2的非叶子结点个数为n2,则n0 = n2 +1
4、具有n个结点的完全二叉树的深度K为log2(n+1)上取整
5、具有n个(n>0)结点的完全二叉树的高度为【log2 n】+1
6、对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有结点从0开始编号,则对于编号为i的结点有:
. 若i>0,双亲的编号:(i-1)/2; i=0, i为根节点编号,无双亲结点。
. 若2i +1<n,左孩子编号:2i+1,否则没有左孩子
. 若21+2<n,右孩子编号:2i+2,否则没有右孩子

树的遍历

树的遍历分为三种 分别是前序遍历、中序遍历、后序遍历
前序遍历的顺序是: 根->左子树->右子树.
中序遍历的顺序是:左子树->根->右子树.
后序遍历的顺序是:左子树->右子树->根.

代码实现如下:

public class BinaryTree {static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}}public TreeNode createTree(){TreeNode A = new TreeNode('A');TreeNode B = new TreeNode('B');TreeNode C = new TreeNode('C');TreeNode D = new TreeNode('D');TreeNode E = new TreeNode('E');TreeNode F = new TreeNode('F');TreeNode G = new TreeNode('G');TreeNode H = new TreeNode('H');A.left = B;A.right = C;B.left = D;B.right = E;C.left = F;C.right = G;E.right = H;return A;}//前序遍历public void preOrder(TreeNode root){if (root == null){return;//空树}System.out.println(root.val+" ");preOrder(root.left);preOrder(root.right);}//中序遍历public void inOrder(TreeNode root){if (root == null){return;}inOrder(root.left);System.out.println(root.val+" ");inOrder(root.right);}//后序遍历public void postOrder(TreeNode root){if (root == null){postOrder(root.left);postOrder(root.right);System.out.println(root.val+" ");}}
}

下面是我觉得比较有意思的题:
在这里插入图片描述
就比如上面这道 相信同学们第一眼看到求叶子结点就想到了我们二叉树的一个重要性质:n0=n2+1;且n=n0+n1+n2 但是仅仅靠这两个条件和题中所给的信息还是算不出来 通过画图我们可以知道完全二叉树度为1的结点 只有两种情况 那就是n1不是0个就是1个
加上这个完全二叉树的性质解决这道题就轻而易举了
大家可以去试试哈

总结

树的内容还有很多 比如树的相关操作 还有树和森林的转换 还有一些树的相关OJ题 树的内容很广 应用也很广 需要我们慢慢去摸索 下次我们就学习树的有关操作和一些Oj题的解法 感谢大家的支持 。

学习没有捷径需要我们不断沉淀 不断摸索。

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

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

相关文章

GaussDB数据库表创建行访问控制策略

目录 一、前言 二、GaussDB中的行访问控制 1、CREATE ROW LEVEL SECURITY POLICY语法 2、ALTER ROW LEVEL SECURITY POLICY语法 3、ROW LEVEL SECURITY策略与适配SQL语法关系 三、GaussDB中的行访问控制策略示例 1、实现GaussDB行访问控制的一般步骤 2、行访问控制策略…

关于#c语言#的问题:分析递归调用的过程◇画出调用过程各语句执行过程

关于#c语言#的问题&#xff1a;分析递归调用的过程◇画出调用过程各语句执行过程 当涉及到递归调用的过程时&#xff0c;可以通过绘制函数调用栈来分析和理解递归的执行过程。下面是一个示例的C语言递归函数和相应的调用过程&#xff1a; #include <stdio.h>void recurs…

详解 Jeecg-boot 框架如何配置 elasticsearch

目录 一、下载安装 Elasticsearch 1、 地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 2、下载完成后&#xff0c;解压缩&#xff0c;进入config目录更改配置文件 3、 修改配置完成后&#xff0c;前往bin目录启动el 4、访问&#xff1a;localhost:92…

【Stm32-F407】全速DAP仿真器下载程序

文章内容如下: 1) 全速DAP仿真器简介2) 全速DAP仿真器下载程序流程 1) 全速DAP仿真器简介 1&#xff09;全速DAP仿真器简介 DAP全称 Data Acquisition Processor&#xff0c;是一种用于数据采集和实时控制的设备。本文使用的全速DAP仿真器遵循ARM公司的CMSIS-DAP标准&#xff…

采购oled屏幕,应注意什么

在采购OLED屏幕时&#xff0c;应注意以下几点&#xff1a; 规格和参数&#xff1a;了解OLED屏幕的规格和参数&#xff0c;包括尺寸、分辨率、亮度、对比度、响应时间等。确保所采购的屏幕符合项目的需求和预期效果。 品质和可靠性&#xff1a;选择具有可靠品质和稳定性的OLED屏…

Docker单点部署[8.11.3] Elasticsearch + Kibana + ik分词器

文章目录 一、Elasticsearch二、Kibana三、访问四、其他五、ik分词器第一种&#xff1a;在线安装第二种&#xff1a;离线安装 Elasticsearch 和 Kibana 版本一般需要保持一致才能一起使用&#xff0c;但是从 8.x.x开始&#xff0c;安全验证不断加强&#xff0c;甚至8.x.x之间…

geemap学习笔记029:使用Earth Engine数据--几何(Geometry)数据

前言 从本节开始将会分类别的进行学习&#xff0c;例如使用Earth Engine数据、使用本地地理数据、可视化地理数据、分析地理数据等&#xff0c;当然前面介绍过的&#xff0c;就不再赘述。 1 导入库并显示地图 import ee import geemapee.Initialize()2 创建几何对象-1 Map …

电子商务网站知识|搭建自己的电子商务网站需要注意什么|搭建电商独立站的注意事项

电子商务网站建设步骤包括什么呢? 电子商务网站建设第一步&#xff0c;网站的规划与设计 电子商务网站算是一个比较复杂的系统&#xff0c;电商网站建设前就要想好需要有的功能。电子商务网站的规划也是建所有网站都需要做的事情&#xff0c;在规划设计中需要对网站进行整体…

【计算机网络】TCP协议——1.报文格式详解

前言 上篇讲解了UDP报文格式。TCP和UDP是同层协议&#xff0c;都属于传输层&#xff0c;数据来源于上层——应用层 目录 一. TCP协议概述 二. TCP报文格式 1. 两个问题 2. 确认号和序列号 3. 标志位字段 4. 窗口大小 5. 校验和字段 6. 紧急指针与紧急数据 7. 选项字…

【uniapp小程序-上拉加载】

在需要上拉加载的页面的page.json上添加红框框里面的 onReachBottom() {if(this.commentCurrent<this.commentTotal){this.commentCurrent 1; this.commentList();this.status loading;}else{this.status ;} }, methods:{commentList(){let params {courseid:this.cour…

QUIC在零信任解决方案的落地实践

一 前言 ZTNA为以“网络为中心”的传统企业体系架构向以“身份为中心”的新型企业安全体系架构转变&#xff0c;提供解决方案。随着传统网络边界不断弱化&#xff0c;企业SaaS规模化日益增多&#xff0c;给终端安全访问接入创造了多元化的空间。其中BYOD办公方式尤为突出&#…

统一日志管理方案:Spring项目logback日志与logstash和Elasticsearch整合

原创/朱季谦 最近在做一个将分布式系统的日志数据通过logstash传到kafka的功能&#xff0c;做完之后决定业余搭一个ELK日志分析系统&#xff0c;将logstash采集到的日志传给Elasticsearch。经过一番捣鼓&#xff0c;也把这个过程给走通了&#xff0c;于是写了这篇总结&#xff…

Linux发行版比较:Ubuntu、CentOS、Red Hat与其他系统的优劣分析

导言 Linux作为开源操作系统&#xff0c;有众多不同的发行版&#xff0c;每个发行版都有其独特的特性和适用场景。本文将聚焦于比较Ubuntu、CentOS、Red Hat和其他系统&#xff0c;深入分析它们的优势、用途以及在不同领域的应用。Linux操作系统的生态系统中&#xff0c;Ubuntu…

SpringCloudAliBaba篇之Seata:分布式事务组件理论与实践

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成&#xff0c;事务具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。这四个属性通常称为ACID原则。 原子性(atomici…

【AI提示词专栏】提示词思维导图帮助

提示词重要作用 提示词&#xff0c;就像是我们生活中的“小助手”或者“贴心小棉袄”&#xff0c;总是在关键时刻给我们提供帮助和指引。它们就像那些无处不在的小标签&#xff0c;时刻提醒我们该做什么、不该做什么&#xff0c;或者给我们一些有趣的启示。 比如&#xff0c;在…

HarmonyOS4.0从零开始的开发教程19HarmonyOS应用/元服务上架

HarmonyOS&#xff08;十七&#xff09;HarmonyOS应用/元服务上架 概述 当您开发、调试完HarmonyOS应用/元服务&#xff0c;就可以前往AppGallery Connect申请上架&#xff0c;华为审核通过后&#xff0c;用户即可在华为应用市场获取您的HarmonyOS应用/元服务。 HarmonyOS会…

HTML_CSS的基本选择器的使用及其作用范围和优先级

目录 ✨CSS的使用&#xff1a;行内样式内部样式外部样式 ✨CSS基本选择器&#xff1a;id选择器class选择器标签选择器 ✨优先级&#xff1a;选择器的优先级样式表的优先级 ✨CSS的使用&#xff1a; 根据定义CSS的位置不同&#xff0c;分为行内样式、内部样式和外部样式 行内样…

美颜SDK技术对比,深入了解视频美颜SDK的工作机制

如何在实时视频中呈现更加自然、美丽的画面&#xff0c;而这正是美颜SDK技术发挥作用的领域之一。本文将对几种主流视频美颜SDK进行深入比较&#xff0c;以揭示它们的工作机制及各自的优劣之处。 随着科技的不断进步&#xff0c;美颜技术已经从简单的图片处理发展到了视频领域…

AI绘画室内设计提示词大全(持续更新)

当你开始使用AI绘画进行室内设计&#xff08;interior design&#xff09;时&#xff0c;选择合适的提示词和关键概念对于成功构思和实现你的设计理念至关重要。以下是一些关于室内设计的提示词&#xff0c;涵盖了空间类型、设计风格、光线效果、布局规划、材料类型以及其他要求…

硬件基础-电容

电容 本质&#xff1a;电容两端电压不能激变&#xff0c;所以可以起到稳定电压作用。充放电。 电容量的大小: 想使电容容量大:①使用介电常数高的介质 ②增大极板间的面积 ③减小极板间的距离。 品牌 国外&#xff1a;村田 muRata、松下 PANASONIC、三星 SAMSUNG、太诱 TAI…