数据结构:二叉搜索树(BST)的基本操作
概述
学习过数据结构的童鞋都应该知道,对树的操作是一些最基本的技能(本文是对后面要写B树、B-树、B+树的一个前导,已经熟悉的朋友可以跳过了)。而在树结构中,二叉树又是最基础的。虽然这些知识是比较基础的,不过对于BST的操作中,删除是一个相对比较麻烦的。这对于新手来说可能不太好理解,下面就以BST中节点的删除为主,其他操作为辅的策略来编写本篇文章。希望对你能有所帮助。
版权说明
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Q-WHai
发表日期: 2015年12月21日
链接:https://qwhai.blog.csdn.net/article/details/50366993
来源:CSDN
更多内容:分类 >> 算法与数学
基本操作:
1.插入
public void insert(int _value) {Node node = root;boolean inserted = false;while(!inserted) {if (_value == node.getValue()) {inserted = true;} else if (_value < node.getValue()) {Node leftNode = node.getLeft();if (leftNode == null) {leftNode = new Node(_value);node.setLeft(leftNode);inserted = true;} else {node = leftNode;}} else {Node rightNode = node.getRight();if (rightNode == null) {rightNode = new Node(_value);node.setRight(rightNode);inserted = true;} else {node = rightNode;}}}}
2.查找
这里就拿找到一个待删除节点为例作说明。
private Node[] searchRemoveNode(int _value) {Node parentNode = null;Node removeNode = root;while(removeNode != null) {if (removeNode.getValue() == _value) {break;}if (removeNode.getValue() < _value) {parentNode = removeNode;removeNode = removeNode.getRight();}if (removeNode.getValue() > _value) {parentNode = removeNode;removeNode = removeNode.getLeft();}}return new Node[]{parentNode, removeNode};}
3.删除
嗯,重点来了。
关于二叉搜索树的删除是相对比较麻烦的。这是为什么呢?我们知道二叉搜索可以快速查找某一个元素是否存在的原因,是BST遵循了一些规则。而我们麻烦的原因也正因为这个规则。
或许你会说,删除有什么难的。直接记录一下待删除节点的左、右孩子节点,再遍历孩子节点并按之前的方式插入到BST中不就是可以了么?有什么难的?
这是一个思路,但是不是太好,因为使用它我们总是会有一种提心吊胆的感觉。为什么?我们现在说明一种情况。比方说,我有一棵BST。它的待删除节点是10000,左右孩子节点都有9999个节点。那么是不是就是说我们还要再把这9999 * 2个节点再插入到BST中呢?而且插入过程中还有对树的遍历。
说明上面那么太过生硬的方法之后,现在我就来说一个软一点的方法。我们先来看下面的三张图:
图-1 删除一个无子节点的节点
图-2 删除只有一个子节点的节点
图-3 删除有两个子节点的节点
从上面的三张图我们就可以看出,要删除BST中的一个节点是要分情况讨论的。在第一种情况中,没什么好说的,就是直接删除就OK。代码如下:
private void removeNodeNoChild(Node parentNode, Node removeNode) {if (parentNode.getValue() == removeNode.getValue()) {return;} else if (parentNode.getValue() < removeNode.getValue()) {parentNode.setRight(null);} else {parentNode.setLeft(null);}}
在第二种方法中,我要删除节点80。不过这个时候不能直接删除,因为待删除节点有一个子节点。我们把这个子节点挂到节点80的话父节点上就可以了。代码如下:
private void removeNodeOneChild(Node parentNode, Node removeNode) {if (parentNode.getValue() == removeNode.getValue()) {return;}if (removeNode.getValue() < parentNode.getValue()) {// 父节点的左孩子parentNode.setLeft(removeNode.getLeft() == null ? removeNode.getRight() : removeNode.getLeft());} else {// 父节点的右孩子parentNode.setRight(removeNode.getLeft() == null ? removeNode.getRight() : removeNode.getLeft());}}
第三种情况就复杂一些。因为我们既不能直接删除,也不能把节点30的子节点挂到节点30的父节点20上面(因为每个节点的右孩子只能有一个,而节点30有两个孩子)。
我们的做法是找到待删除节点(节点30)左孩子中最大的节点,这里我们打到了节点27。再把节点27来替换掉要删除的节点30。这样既快捷高效又保证不破坏BST的规则结构。代码如下:
private void removeNodeTwoChild(Node parentNode, Node removeNode) {if (parentNode.getValue() == removeNode.getValue()) {return;}Node maxValueNode = maxValueNode(removeNode.getLeft());if (removeNode.getValue() < parentNode.getValue()) {// 父节点的左孩子parentNode.setLeft(maxValueNode);} else {// 父节点的右孩子parentNode.setRight(maxValueNode);}maxValueNode.setLeft(removeNode.getLeft());maxValueNode.setRight(removeNode.getRight());}
Demo源码下载:
https://github.com/qwhai/simple-tree
征集
如果你也需要使用ProcessOn这款在线绘图工具,可以使用如下邀请链接进行注册:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d
数据结构:二叉搜索树(BST)的基本操作相关推荐
- 数据结构 二叉搜索树BST的实现与应用
概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...
- 23王道数据结构二叉搜索树(BST)算法题(6-11题)总结(伪代码)
6.判断给定的二叉树是否是二叉排序树 算法思想:中序遍历,一棵树为二叉排序树即左右子树为二叉排序树,且当前根节点和左右子树呈递增序列,对左右子树也是如此判断,显然是个递归过程 ...
- 【数据结构与算法】3.二叉搜索树(BST)、c++代码
二叉搜索树(BST).c++代码 参考 https://blog.csdn.net/c_living/article/details/81021510
- 看动画学算法之:二叉搜索树BST
文章目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 看动画学算法之:二叉搜索树BST 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的 ...
- 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)
1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...
- 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点
为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总 ...
- 二叉搜索树BST的学习
文章目录 二叉搜索树BST 什么是BST? 用BST做什么? 一.BST的特性 BST的特性是什么? 1.[230. 二叉搜索树中第K小的元素](https://leetcode.cn/problem ...
- 二叉搜索树(BST)详解
数据结构:二叉搜索树(BST) 今天咱们来聊聊二叉搜索树,先从字面上来理解,二叉,指的是有两个分支,左子树和右子树:搜索树,啥意思呢,搜索,是不是就是之前学过dfs和bfs那边学过,对啊,dfs就是深 ...
- 数据结构---二叉搜索树
数据结构-二叉搜索树 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define N 100 #define elemType bstTree* #include<st ...
- 二叉搜索树 (BST)
二叉搜索树 (BST : Binary Search Tree) 又名 二叉查找树 或 二叉排序树. 二叉搜索树: 左孩子的值 一定小于或等于 父结点的值 二叉搜索树: 右孩子的值 一定大于或等于 父 ...
最新文章
- Linux 文件的权限
- antd 给input设置值_Antd 中 Input 组件默认值的显示
- DOM与元素节点内联样式
- 多GPU运行Deep Learning 和 并行Deep Learning(待续)
- [ExtJs6] 环境搭建及创建项目
- LeetCode训练
- Cowrie蜜罐的部署(ubt亲测)
- 生产者消费者之阻塞队列版本
- 子类重写方法aop切不到_SpringBoot源码之旅——AOP
- Ubuntu下The program 'python' can be found in the following packages:
- 2018 CodeM复赛:B. 软件包管理器(二分)
- PHP添加网站版权信息,如何将版权和作者信息添加到用PHP创建的图像?
- 兄弟j220怎么清零_BROTHER 兄弟一体机 复位清除计数器
- 零基础学SQL(三、MYSQL环境变量配置及启动)
- MSP430开发环境配置
- hive表加载csv格式数据或者json格式数据
- windows 10 时间同步,时间显示不准自动校准。
- 网络与系统安全笔记------访问控制
- 使用adb连接夜神模拟器,查看多开模拟器端口号
- idea maven项目提示程序包xxx不存在,找不到符号xxx的解决办法