懵逼树上懵逼果:学习二分搜索树

点击“小詹学Python”,选择“置顶”公众号

重磅干货,第一时间送达640?wx_fmt=jpeg

本文转载自五分钟学算法

数组、栈、队列、链表都是线性结构,树则是另外一种极其重要的数据结构。

树的种类有很多种,我们先从简单的 二分搜索树 开始树的学习。

二分查找法

二分查找法定义

是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;

如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

如果在某一步骤数组为空,则代表找不到。

这种搜索算法每一次比较都使搜索范围缩小一半。

动画演示

640?wx_fmt=gif

动画说明

注意:二分查找的前提是数列必须是有序的。

  • 目标是搜索数字 5

  • 首先,检查有序数列中心的数字,这里查找到时数字 4

  • 4 与 将要搜索的数字 5 进行比较,由于 4 小于 5,图中可以发现 5 4 的右边

  • 这时,就不需要观察 4 左边的数字了,置灰删除掉

  • 检查剩余有序数列中心的数字,这时是 5

  • 找到了这个数字

二叉查找树(Binary Search Tree)基础

二叉查找树也可叫做二分查找树。

它不仅可以查找数据,还可以高效地插入、删除数据。

特点:每个节点的key值大于左子节点,小于右子节点。

注意它不一定是完全的二叉树。

640?wx_fmt=png

class Node {  E e;  Node left;  // 左孩子  Node right; // 右孩子}

二叉查找树有两个属性:

  • 所有节点都比左子树中的节点大

  • 所有节点都小于右子树中的节点

通过这两个属性,可以推断出以下结论:

  • 二叉查找树最小的节点位于最顶端节点的最左边子树行的末尾(如图数字 3

  • 二叉查找树的最大节点位于最顶端节点的最右边的子树行的末尾(如图数字 28

通过以下方式的进行添加元素与删除元素的操作,可以保留二叉查找树的完整性。

我们通过两组添加元素,三组删除元素,一组查找元素的操作来理解二叉查找树的属性性质。

添加元素操作

640?wx_fmt=gif

核心思想:从根节点开始找插入的位置,满足二叉搜索树的特性,比左子节点大,比右子节点小.

步骤:

  • 从根节点开始,先比较当前节点,如果当前节点为null那么就插入到这个节点。

  • 如果上面的节点不是null,那么和当前节点比较,如果小于节点就往左子树放,如果大于节点就往右子树放。

  • 然后分别对左子树或者右子树递归的递归进行如上 1 、 2 步骤的操作

添加元素 1

  • 从二叉查找树的最顶端节点开始,去找到附加节点的正确位置

  • 由于 1 < 15 , 向左走

  • 1 < 9 ,继续向左走

  • 1 < 3,继续向左走,但因为没有节点在其后序前方,因此将它作为一个新节点进行添加

添加元素 4

  • 同样的从二叉查找树的最顶端节点开始,去找到附加节点的正确位置

  • 由于 4 < 15 , 向左走

  • 4 < 9 ,继续向左走

  • 4 > 3,向右走

  • 4 < 8,向左走,但因为没有节点在其后序前方,因此将它作为一个新节点进行添加

代码实现

640?wx_fmt=png

删除元素操作

640?wx_fmt=gif

步骤:

  • 找到左子树中找左子树中所有节点的最大的节点

  • 将这个节点赋值到删除节点的位置

删除元素 28

  • 该节点没有子类,直接删除

删除元素 8

  • 该节点有1个子类

  • 目标节点被删除,将子节点移动到已删除节点的位置

删除元素 9

  • 该节点有2个子类

  • 目标节点被删除,从删除节点的左子树中找到最大的节点,将其移到到删除的节点的位置

代码实现

640?wx_fmt=png

查找元素操作

640?wx_fmt=gif

查找元素 12

  • 同样的,从二叉查找树的最顶端节点开始搜索

  • 12 < 15 ,向左走

  • 12 > 4 ,向右走

  • 找到 12

代码实现

640?wx_fmt=png

可以看出,使用二叉查找树可以实现高效搜索。

640?wx_fmt=png


但是如果树接近形成直线,那么搜索效率将极其差,变成了线性搜索。

因此二叉查找树就需要进行改进为平衡二叉树,比较常见的 Balanced Binary Tree有:

  • 红黑树

  • tree

  • AVL tree

  • Splay tree

  • Treap

二分搜索树的遍历

遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。二叉树的遍历有三种:

  • 前序遍历(Preorder Traversal):先访问当前节点,再依次递归访问左右子树

  • 中序遍历(Inorder Traversal):先递归访问左子树,再访问自身,再递归访问右子树

  • 后序遍历(Postorder Traversal):先递归访问左右子树,最后再访问当前节点。

前序遍历

640?wx_fmt=gif

中序遍历

640?wx_fmt=gif

后序遍历

640?wx_fmt=gif

推荐阅读

一张大尺度美女图,竟然推进了图片算法的进步。


640?wx_fmt=png

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值