概述

学习过数据结构的童鞋都应该知道,对树的操作是一些最基本的技能(本文是对后面要写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)的基本操作相关推荐

  1. 数据结构 二叉搜索树BST的实现与应用

    概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...

  2. 23王道数据结构二叉搜索树(BST)算法题(6-11题)总结(伪代码)

    6.判断给定的二叉树是否是二叉排序树 算法思想:中序遍历,一棵树为二叉排序树即左右子树为二叉排序树,且当前根节点和左右子树呈递增序列,对左右子树也是如此判断,显然是个递归过程              ...

  3. 【数据结构与算法】3.二叉搜索树(BST)、c++代码

    二叉搜索树(BST).c++代码 参考 https://blog.csdn.net/c_living/article/details/81021510

  4. 看动画学算法之:二叉搜索树BST

    文章目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 看动画学算法之:二叉搜索树BST 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的 ...

  5. 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)

    1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...

  6. 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点

    为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总 ...

  7. 二叉搜索树BST的学习

    文章目录 二叉搜索树BST 什么是BST? 用BST做什么? 一.BST的特性 BST的特性是什么? 1.[230. 二叉搜索树中第K小的元素](https://leetcode.cn/problem ...

  8. 二叉搜索树(BST)详解

    数据结构:二叉搜索树(BST) 今天咱们来聊聊二叉搜索树,先从字面上来理解,二叉,指的是有两个分支,左子树和右子树:搜索树,啥意思呢,搜索,是不是就是之前学过dfs和bfs那边学过,对啊,dfs就是深 ...

  9. 数据结构---二叉搜索树

    数据结构-二叉搜索树 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define N 100 #define elemType bstTree* #include<st ...

  10. 二叉搜索树 (BST)

    二叉搜索树 (BST : Binary Search Tree) 又名 二叉查找树 或 二叉排序树. 二叉搜索树: 左孩子的值 一定小于或等于 父结点的值 二叉搜索树: 右孩子的值 一定大于或等于 父 ...

最新文章

  1. Linux 文件的权限
  2. antd 给input设置值_Antd 中 Input 组件默认值的显示
  3. DOM与元素节点内联样式
  4. 多GPU运行Deep Learning 和 并行Deep Learning(待续)
  5. [ExtJs6] 环境搭建及创建项目
  6. LeetCode训练
  7. Cowrie蜜罐的部署(ubt亲测)
  8. 生产者消费者之阻塞队列版本
  9. 子类重写方法aop切不到_SpringBoot源码之旅——AOP
  10. Ubuntu下The program 'python' can be found in the following packages:
  11. 2018 CodeM复赛:B. 软件包管理器(二分)
  12. PHP添加网站版权信息,如何将版权和作者信息添加到用PHP创建的图像?
  13. 兄弟j220怎么清零_BROTHER 兄弟一体机 复位清除计数器
  14. 零基础学SQL(三、MYSQL环境变量配置及启动)
  15. MSP430开发环境配置
  16. hive表加载csv格式数据或者json格式数据
  17. windows 10 时间同步,时间显示不准自动校准。
  18. 网络与系统安全笔记------访问控制
  19. 使用adb连接夜神模拟器,查看多开模拟器端口号
  20. idea maven项目提示程序包xxx不存在,找不到符号xxx的解决办法

热门文章

  1. C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符
  2. 现代密码学3.4--CPA安全,多次加密
  3. 全网最强Python版《超级玛丽》小游戏,我还是你的马里奥嘛?
  4. github:已经提交并push后再次追加提交
  5. 2020-11-8(activity状态以及任务栈)
  6. 160个Crackme009
  7. MySQL免安装版配置教程
  8. JavaScirpt类型检测函数总结
  9. 1.7 Java 8中Map新增的方法
  10. 将数字字符串格式化为指定长度