一篇文章,带你全面的了解二叉树-记得点赞(1)

本文详细介绍了树的数据结构特性,特别关注了二叉树的概念、满二叉树和完全二叉树的区别,以及在Java中创建、操作(如查找、插入和删除)二叉树的方法,包括查找最小和最大键的算法。

3)叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。

4)分支结点:也称为非终端结点,度不为零的结点成为非终端结点。

5)结点的层次:从根结点开始,根结点的层次为1,根的直接后继层次为2,以此类推。

6)树的度:树中所有结点的度的最大值。

7)树的深度:树中结点的最大层次。

1. 树的特点

树作为一种特殊的数据结构,有非常多的特性,比如:

1)每个结点有多个或者零个子结点

2)没有父结点的结点成为根结点,没有子结点的结点成为叶结点

3)每一个非根结点只有一个父结点

4)每个结点及其后代结点整体上可以看做是一棵树,称为当前结点为根的子树

2. 二叉树的基本定义

1)二叉树就是度不超过2的树,其每个结点最多有两个子结点

2)二叉树的结点分为左结点和右结点

3. 满二叉树

1)二叉树的每一层的结点度都达到最大值,则这个二叉树就是满二叉树

2)一棵深度为n的满二叉树,有2^n-1个结点

4. 完全二叉树

叶子结点只能出现在最下层和次下层,最后一层的叶子结点在左边连续,倒数第二层的叶子结点在右边连续,我们称为完全二叉树。

三、二叉树的创建


接下来,我们通过代码来描述二叉树,语言以Java为例,其中结点类定义如下:

二叉查找树类定义如下:

相关类定义好后,我们来看具体的方法实现,下面分别介绍。

1. size()方法

size()方法相对简单,每次添加元素加一,删除元素减一,维护一个公共的变量 num 即可,代码实现如下:

2. put(Key key,Value value)方法

put(Key key,Value value)方法可以利用重载方法 put(Node x,Key key,Value value),因此实现也相对简单,其中第一个参数只需要传根结点即可,代码实现如下:

3. put(Node x,Key key,Value value)方法

put(Node x,Key key,Value value)方法应该是整个类中实现相对较为复杂的,下面进行简单的分析。

第一种情况,当前树中没有任何一个结点,直接将新插入的结点作为根结点。

第二种情况,当前树不为空,则从根结点开始。这种情况有可以细分为三种情况:

1)如果新结点的key小于当前结点的key,则继续查找当前结点的左子结点。

2)如果新结点的key大于当前结点的key,则继续查找当前结点的右子结点。

3)如果新结点的key等于当前结点的key,则树中已经存在这样的结点,替换该结点的value值即可。

具体的代码实现如下:

4. get(Key key)方法

get(Key key)方法和 put(Key key,Value value)方法类似,也可以利用重载方法 get(Node x,Key key)来实现,代码实现如下:

5. get(Node x,Key key)方法

get(Node x,Key key)方法实现查询方法从根结点开始,如果要查询的key小于当前结点的key,则继续找当前结点的左子结点;如果要查找的key大于当前结点的key,则继续找当前结点的右子结点;如果要查找的key等于当前结点的key,则返回当前结点的value。

具体的代码实现如下:

通过上面的代码,我们可以看出 get()方法和 put()方法类似,都是通过递归调用实现的。

6. delete(Key key)方法

delete(Key key)方法也是一样的思路,调用后面的重载方法就行了,代码实现如下:

7. delete(Node x,Key key)方法

删除方法的实现思路,以最复杂的情况为例,首先找到被删除的结点,找到被删除结点右子树中的最小结点 minNode,删除右子树中的最小结点,让被删除结点的左子树成为最小结点 minNode 的左子树,让被删除结点右子树成为最小结点minNode的右子树,让被删除结点的父结点指向最小结点 minNode。

具体的代码实现如下:

既然代码已经写完了,接下来通过代码来验证一下,看看我们写得是否正确:

答案输出:

3

李四

2

Nice,太好了,通过上述输出结果已经证明了程序是正确的。

四、查找二叉树中最小和最大的键


比如二叉树中用来记录某个公司员工薪资和员工姓名数据,或者某班级学生们的排名和姓名数据。如何快速找出排名最高和最低的同学数据?

这样的话,该怎么做呢?其实,一般还可以整理出如下四个方法,定义如下:

1. min()方法

min()方法和上面提到的 get()和 put()方法类似,也可以使用下面的重载方法实现,具体代码如下:

// 找出树中最小的键

public key min() {

return min(root).key;

}

2. min(Node x)方法

min(Node x)方法需要根据传入的结点位置,查找左子树中的最小的结点,如果为空,则直接返回空,具体代码实现如下:

// 找出树中最小键所在的结点

public Node min(Node x) {

if (x == null) {

return x;

}

Node minNode = x;

while (minNode.left != null) {

minNode = minNode.left;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

[外链图片转存中…(img-zDBOcJ15-1713493538634)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值