看动画学算法之:二叉搜索树BST
简介
树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的非线性的数据结构。
树是由很多个节点组成的,每个节点可以指向很多个节点。
如果一个树中的每个节点都只有0,1,2个子节点的话,这颗树就被称为二叉树,如果我们对二叉树进行一定的排序。
比如,对于二叉树中的每个节点,如果左子树节点的元素都小于根节点,而右子树的节点的元素都大于根节点,那么这样的树被叫做二叉搜索树(Binary Search Tree)简称BST。
今天我们来探讨一下BST的性质和对BST的基本操作。
BST的基本性质
刚刚我们已经讲过BST的基本特征了,现在我们再来总结一下:
- BST中任意节点的左子树一定要比该节点的值要小
- BST中任意节点的右子树一定要比该节点的值要大
- BST中任意节点的左右子树一定要是一个BST。
看一张图直观的感受一下BST:
BST的构建
怎么用代码来构建一个BST呢?
首先,BST是由一个一个的节点Node组成的,Node节点除了保存节点的数据之外,还需要指向左右两个子节点,这样我们的BST完全可以由Node连接而成。
另外我们还需要一个root节点来表示BST的根节点。
相应的代码如下:
public class BinarySearchTree { //根节点 Node root; class Node { int data; Node left; Node right; public Node(int data) { this.data = data; left = right = null; } } }
BST的搜索
先看下BST的搜索,如果是上面的BST,我们想搜索32这个节点应该是什么样的步骤呢?
先上图:
搜索的基本步骤是:
- 从根节点41出发,比较根节点和搜索值的大小
- 如果搜索值小于节点值,那么递归搜索左侧树
- 如果搜索值大于节点值,那么递归搜索右侧树
- 如果节点匹配,则直接返回即可。
相应的java代码如下:
//搜索方法,默认从根节点搜索 public Node search(int data){ return search(root,data); } //递归搜索节点 private Node search(Node node, int data) { // 如果节点匹配,则返回节点 if (node==null || node.data==data) return node; // 节点数据大于要搜索的数据,则继续搜索左边节点 if (node.data > data) return search(node.left, data); // 如果节点数据小于要搜素的数据,则继续搜索右边节点 return search(node.right, data); }
BST的插入
搜索讲完了,我们再讲BST的插入。
先看一个动画:
上的例子中,我们向BST中插入两个节点30和55。
插入的逻辑是这样的:
- 从根节点出发,比较节点数据和要插入的数据
- 如果要插入的数据小于节点数据,则递归左子树插入
- 如果要插入的数据大于节点数据,则递归右子树插入
- 如果根节点为空,则插入当前数据作为根节点
相应的java代码如下:
// 插入新节点,从根节点开始插入 public void insert(int data) { root = insert(root, data); } //递归插入新节点 private Node insert(Node node, int data) { //如果节点为空,则创建新的节点 if (node == null) { node = new Node(data); return node; } //节点不为空,则进行比较,从而递归进行左侧插入或者右侧插入 if (data < node.data) node.left = insert(node.left, data); else if (data > node.data) node.right = insert(node.right, data); //返回插入后的节点 return node; }
BST的删除
BST的删除要比插入复杂一点,因为插入总是插入到叶子节点,而删除可能删除的是非叶子节点。
我们先看一个删除叶子节点的例子:
上面的例子中,我们删除了30和55这两个节点。
可以看到,删除叶子节点是相对简单的,找到之后删除即可。
我们再来看一个比较复杂的例子,比如我们要删除65这个节点:
可以看到需要找到65这个节点的右子树中最小的那个,替换掉65这个节点即可(当然也可以找到左子树中最大的那个)。
所以删除逻辑是这样的:
- 从根节点开始,比较要删除节点和根节点的大小
- 如果要删除节点比根节点小,则递归删除左子树
- 如果要删除节点比根节点大,则递归删除右子树
- 如果节点匹配,又有两种情况
- 如果是单边节点,直接返回节点的另外一边
- 如果是双边节点,则先找出右边最小的值,作为根节点,然后将删除最小值过后的右边的节点,作为根节点的右节点
看下代码的实现:
// 删除新节点,从根节点开始删除 void delete(int data) { root = delete(root, data); } //递归删除节点 Node delete(Node node, int data) { //如果节点为空,直接返回 if (node == null) return node; //遍历左右两边的节点 if (data < node.data) node.left = delete(node.left, data); else if (data > root.data) node.right = delete(node.right, data); //如果节点匹配 else { //如果是单边节点,直接返回其下面的节点 if (node.left == null) return node.right; else if (node.right == null) return node.left; //如果是双边节点,则先找出右边最小的值,作为根节点,然后将删除最小值过后的右边的节点,作为根节点的右节点 node.data = minValue(node.right); // 从右边删除最小的节点 node.right = delete(node.right, node.data); } return node; }
这里我们使用递归来实现的删除双边节点,大家可以考虑一下有没有其他的方式来删除呢?
本文的代码地址:
本文收录于 www.flydean.com
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
11月OSC“优秀原创作者”TOP10榜单公布,速来围观!
有志者,事竟成,恭喜以下10名作者获得OSC 11月份“优秀原创作者” 荣誉。 @获奖作者请于一周内登陆账号,个人主页-修改个人资料,完善一下收货信息哦,奖品将在一周内寄出哦。 未上榜的童鞋继续加油哦,12月份评选正在进行中,感兴趣的小伙伴记得点击以下链接,查看活动详情哦: OSCHINA作者月度评选活动开启,精美礼品等你来拿! 11月「优秀原创作者」榜单 排名 ID 昵称 当月发布文章被推荐数 奖品 1 5079097 PHP开发工程师 10 小米电动牙刷一个;荣誉证书一张;专属勋章 2 862741 跟着Mic学架构 9 小米电动牙刷一个;荣誉证书一张;专属勋章 3 4788503 浩宇天尚 8 小米电动牙刷一个;荣誉证书一张;专属勋章 4 3556271 削微寒 7 OSC文化T恤一件;荣誉证书一张;专属勋章 5 5448872 Tom弹架构 6 OSC文化T恤一件;荣誉证书一张;专属勋章 6 1258330 小傅哥 4 OSC文化T恤一件;荣誉证书一张;专属勋章 7 926749 张晋涛-MoeLove 4 宇航员摆件一套;荣誉证书一张;专属勋章 8 4504882 flyd...
- 下一篇
计算机史最疯狂一幕:豪赌50亿美元,“蓝色巨人”奋身一跃
“Go big or go home. ”是美国人的一句习语,经常会在赛场上听到,NBA球迷应该很熟悉,翻译过来就是“要不变强大,要不滚回家”。在1960年初期的计算机行业,IBM正站在这样一个十字路口。 凭借刚发布不久的能彻底替代穿孔卡片分析机的1401大型机,IBM本可以在市场上轻松躺赚两年,但总裁小托马斯·沃森(Thomas J. Watson Jr.)还不想“躺平”,他从父亲手上继承到这一职位已有四年。 整个行业发展正在加速,但IBM却进入平台期,增长放缓,公司两个计算机部门的“内卷”竞争让产品线变得混杂,而最新产品线的竞争壁垒并不高,这些危机感让他催促手下的IBM高管通过更大的产品创新来提升营收。 彼时,计算机厂商的产品线互不兼容,客户要升级到新机器时,很容易改用其他厂商的产品:基本每个产品都有自己的ISA、软件堆栈、I/O系统和利基市场(分别针对小企业、大企业、科研应用)。各种主机需要量身定做操作系统,兼容性、系统升级等操作无从谈起,定制化系统所耗费的大量人力、财力甚至会超过主机本身。 很快,经过副总裁文森特·利尔森(T. Vincent Learson)等人来回争...
相关文章
文章评论
共有0条评论来说两句吧...