【Java】树

一、概念介绍

树里面的每一个元素其实也都是有说法的。

树里面的每一个元素它也叫做 节点,但有的书上是 结点,其实这两个都是一样的,因为在英文中名字叫做 Node,不同的人在翻译的时候,用的词语不一样而导致的不同,现在我们统一叫做 节点

每一个节点是一个独立的对象,当这样的结点多了以后,就会形成下图的结构。

这个结构很像一颗倒过来的树。

image-20240426203438413

关于树,有一些专业名词需要我们认识。

以下面 16、15、17 为例,其中 1615 的父节点,1516 的左子节点,1716 的右子节点。

image-20240426203625958

每个节点都表示一个对象,它里面不仅要存储当前的数据,额外还有父节点的地址值、左子节点的地址值、右子节点的地址值。

image-20240426203831185

如果一个节点没有父节点,或者没有子节点了,就记为 null

例如 22 是没有父节点的,最下面一排的节点都是没有子节点的,因此在这些节点中对应的位置就会记录 null

在树结构中,每一个节点的子节点数量叫做

如果上面框起来的这些节点,这些节点都有两个子节点,因此它们的度都是 2

再来看最下面的一排,它是没有子节点的,因此它们的度都是 0

这种树我们也称之为二叉树:二叉树中,任意节点的度 <= 2,相当于只有两个分叉。

其实也还有三叉树、四叉树… 但是最常见最基础的就是二叉树,现在大家看见的就是一个标准的二叉树。

image-20240426204208564

这颗二叉树的高度是 4,如果我们此时再来添加一个节点,那么它的高度就变成 5

image-20240426204703292

树高:树的总层数。

从上往下依次为:第一层、第二层…

image-20240426204750394

在整棵树中,最上面的节点称之为 根节点,因此此时 22 就是它的 根节点

这这棵树中,针对于任意的一个节点而言,左下方的结点是它的左子节点,右下方的节点是它的右子节点。

根节点的左子树就是下方蓝色虚线的部分,蓝色虚线框起来的整体就叫做 根节点的左子树

根节点的右子树就是下方绿色虚线的部分,绿色虚线框起来的整体就叫做 根节点的右子树

image-20240426205142104

通过这个思路我们可以发散一下,其他的节点有没有左子树跟右子树呢?当然有。

我们以 26 为例,它的左子树就是蓝色虚线这部分,右子树就是绿色虚线这部分。

image-20240426205311448

二、二叉树

如下图二叉树,每一个结点里面记录的值它是没有什么规律的,因此它仅仅是一颗比较普通的二叉树而已,这样的二叉树几乎没有什么应用场景。

如果想要在 普通的二叉树 中进行查找,只有遍历才行,效率比较低,因此才有了下面的 二叉查找树

image-20240426205424221

再来看右边的这棵树,在这棵树中,数据的规则就比较明显了。

首先它是一个二叉树,因为在二叉树中,任意节点的度 <= 2

查找规律可发现:每个节点的左子节点都比自己小,每个结点的右子节点都比自己大,这样的二叉树我们就会称之为 二叉查找树

image-20240426205535023

三、二叉查找树

1)总述

二叉查找树:又称二叉排序树 或者 二叉搜索树

特点

  • 每一个节点上最多有两个子节点

    这句话就表示它首先得是一颗二叉树才行

  • 任意节点左子树上的值都小于当前节点

  • 任意节点右子树上的值都大于当前节点

接下来我们需要知道二叉查找树它是如何添加节点的,才能让这些数据产生规律。


2)添加

它在添加节点的时候会遵守一个规则:小的存左边,大的存右边,一样的不存。

例如将 7、4、10、5 这四个数据添加到一个二叉查找中。

首先添加 7节点,由于 7节点 是第一个,没惹你跟它比,所以就会将 7节点 当做是 根节点

image-20240426210559066

再来,存入 4节点4节点 就需要跟 7节点 比较了,因为 4节点7节点 小,因此存左边,4节点 相当于就是 7节点 的左子节点。

image-20240426210621512

然后再添加 10节点,还是需要跟根节点进行比较,它比根节点要大,因此存右边,10节点 相当于就是 7节点 的右子节点。

image-20240426210747434

最后添加 5节点,它首先还是先跟根节点比较,发现比 7节点 小,因此需要存 7节点 的左边。

但是 5节点 发现 7节点 的左边已经有人了,因此此时继续比较,会发现 54 大,因此 5 就会当做 4 的右子节点。

image-20240426210940525

每个节点在存入的时候都是按照这样的规则进行比较的,当存入的结点越来越多的时候,就渐渐形成了右下角这棵树的形状。

image-20240426211035029

那如何查找单个数据呢?


3)查找

例如在二叉查找树中要查 5、12、30,其实查找的规则跟刚刚是一样的。

首先来查 5,它需要先跟根节点比一下,由于 5 是比 7 小的,因此证明 5 是在 7 的左边,由于 7 的左边不是 5,因此需要再跟 4 比较一下,由于 54 大,因此 54 的右边,此时就找到了 5

由此可见,在这十个数据中查找5,找三次就找到了,因此树的查找效率还是非常高的。

image-20240426212350902

查找其他数字同理。

如果我们需要查找一个不存在的 30,其实也是一样的,当它一直按照刚刚的规律一直查找到12的右边时,发现12的右边没有节点了,因此就可以断定,在这棵树中没有30这个节点。

image-20240426212541227

四、二叉树遍历方式

PS:下面四种说的是 二叉树 的遍历方式,所有的二叉树都可以采用这样的遍历方式。

前中后序遍历可以根据根节点的顺序来判断。

  • 前序遍历:从根节点开始,然后按照当前节点,左子节点,右子节点的顺序遍历

  • 中序遍历:从最左边的子结点开始,然后按照左子节点,当前节点,右子节点的顺序遍历

    二叉搜索树按照这种方式遍历出来的顺序是从小到大进行排序的,因此这种遍历方式也是作为常见的遍历方式

  • 后序遍历:从最左边的子结点开始,然后按照左子节点,右子节点,当前节点的顺序遍历

  • 层序遍历:从根节点开始一层一层的遍历


五、平衡二叉树

1)二叉查找树的弊端

在添加节点的时候会有这样的特殊情况。

假设现在一共有 7、10、11、12、13 这五个节点,如果按照二叉查找树的规则存入到树中就会变成下图。

image-20240426213806289

假设我们要从上面的这棵树找到 13,就需要从根节点一直查到底,此时要找 5次 才能找到 13,此时就跟一个链表一样了,所以这不合理。

一棵树如果要提高查询效率,左右的高度需要差不多才行。

此时问题就来了,在添加节点的时候,如何将这种树变成左右差不多长的树呢?

这个时候我们就需要来学习 平衡二叉树

image-20240426214139804

2)介绍

它是在二叉查找树的基础上又多了一个规则:任意节点做右子树高度差不能超过1。

例如下面这棵树就不是一颗平衡二叉树,一棵树是否平衡,不能仅仅只看根节点。

先来看根节点,左子树高度为3,右子树高度为4,因此它是满足上面的规则的。

但此时还不能下结论,我们来看 10节点,左子树高度为 0,右子树高度为 3,它是不满足上面规则的,因此它不是一个平衡二叉树。

image-20240426214352509

下面两个就是平衡二叉树

image-20240426214756675

六、树的演变

树是由很多节点组成的,每个节点都是一个独立的对象,它里面有这四部分内容。

image-20240426214919151

当很多节点组合在一起的时候,保证每个节点的度 <= 2,那么此时就会形成二叉树。

最基本的二叉树在存储数据的时候是没有什么规则的,在查找数据的时候非常的麻烦,只能遍历查找,效率非常低。

为了解决这个问题,提高查找效率,我们在添加数据的时候每次都会进行比较,会遵守一个规则:小的存左边,大的存右边,一样的就不存。

这样就形成了二叉查找树,二叉查找树在查找的时候效率就非常高了。

但是这还不是最完美的解决方案,遵守二叉查找树的规则进行添加元素,就会导致左右子树的高度差会很大,如果高度差很大的话,查询效率也会降低,因此为了提高查询效率,避免长短腿出现,就有了平衡二叉树。

在平衡二叉树中又多了一个规则:任意的节点,左右子树高度差不能超过1。

image-20240426215429111

那么平衡二叉树它是如何保持平衡的呢?下节课就开始学习平衡二叉树 保证平衡的机制。

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值