在两节中,我们了解了BST(二叉搜索树)的概念,并且知道了如何在BST中查找一个元素。那我们又如何在BST中去删除一个元素呢?我们将通过本节的例题进行学习!

下面看题:????????????

01

第450题:二叉搜索树中的删除

第450题:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;

如果找到了,删除它。

说明:要求算法时间复杂度为 O(h),h 为树的高度。

示例:

root = [5,3,6,2,4,null,7]

key = 3

5

/ \

3   6

/ \   \

2   4   7

给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。

一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。

5

/ \

4   6

/     \

2       7

另一个正确答案是 [5,2,6,null,4,null,7]。

5

/ \

2   6

\   \

4   7

强烈建议先学习之前两节内容!

以达到最好的学习效果!

02

复习巩固

先复习一下,二叉搜索树(BST)的特性:

1.若它的左子树不为空,则所有左子树上的值均小于其根节点的值

2.若它的右子树不为空,则所有右子树上的值均大于其根节点得值

3.它的左右子树也分别为二叉搜索树

如下图就是一棵典型的BST:

03

图解分析

明确了概念,我们进行分析。我们要删除BST的一个节点,首先需要找到该节点。而找到之后,会出现三种情况。

  1. 待删除的节点左子树为空,让待删除节点的右子树替代自己。

  2. 待删除的节点右子树为空,让待删除节点的左子树替代自己。

  3. 如果待删除的节点的左右子树都不为空。我们需要找到比当前节点小的最大节点(前驱),来替换自己

    或者比当前节点大的最小节点(后继),来替换自己。

分析完毕,直接上代码。

04

代码如下

这里我们给出通过后继节点来替代自己的方案(请后面自行动手实现另一种方案):

 1//go2func deleteNode(root *TreeNode, key int) *TreeNode {3    if root == nil {4        return nil5    }6    if key < root.Val {7        root.Left = deleteNode( root.Left, key )8        return root9    }
10    if key > root.Val {
11        root.Right = deleteNode( root.Right, key )
12        return root
13    }
14    //到这里意味已经查找到目标
15    if root.Right == nil {
16        //右子树为空
17        return root.Left
18    }
19    if root.Left == nil {
20        //左子树为空
21        return root.Right
22    }
23    minNode := root.Right
24    for minNode.Left != nil {
25        //查找后继
26        minNode = minNode.Left
27    }
28    root.Val = minNode.Val
29    root.Right = deleteMinNode( root.Right )
30    return root
31}
32
33
34func deleteMinNode( root *TreeNode ) *TreeNode {
35    if root.Left == nil {
36        pRight := root.Right
37        root.Right = nil
38        return pRight
39    }
40    root.Left = deleteMinNode( root.Left )
41    return root
42}

注:本系列所有教程中都不会用到复杂的语言特性,大家不需要担心没有学过相关语法。算法思想最重要,使用各语言纯属本人爱好。同时,本系列所有代码均在leetcode上进行过测试运行,保证其严谨性!

学会了吗?

无论是不理解还是有别的解题思路都可以在评论区进行留言~

如果已完全掌握,一定记得点击右方“在看”进行每日打卡!

还没进群的小伙伴抓紧啦!

温馨提示

浩仔讲算法~

每天一起学习图解漫画算法。

一起刷题,一起成长!

~长按下方二维码进行关注吧~

关注后有资源~

漫画:二叉树系列 第五讲(BST的删除)相关推荐

  1. Maven系列第五讲 私服讲解

    Maven系列第五讲 环境 私服 Windows10中安装Nexus私服 下载nexus 解压latest-win64.zip 启动nexus 登录Nexus 其他一些常见的操作 Linux安装Nex ...

  2. 二叉搜索树(BST)的删除算法原理解析

    二叉搜索树的删除算法主要分两种情况: 1.要删除的节点只有一个孩子(左孩子或右孩子),这种情况比较简单,只需要将该孩子连接到当前节点的父节点即可. 下面重点讲讲第二种情况: 2.第二种情况便是要删除的 ...

  3. 数据结构——二叉查找树(BST)的删除

    数据结构--二叉树(BST)的删除 文章目录 数据结构--二叉树(BST)的删除 前言 一.BST删除的几种情况 二.节点删除方法 1.一般方法 2.对1方法的优化 3.懒汉删除(前继和后继) 前言 ...

  4. 二叉查找树BST的删除操作

    二叉查找树BST的删除操作(哈工大版) C++代码 /***** 二叉查找树BST *****/ #include<iostream> using namespace std;struct ...

  5. 八十一、Python | Leetcode 二叉树系列(下篇)

    @Author:Runsen @Date:2020/7/6 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  6. 漫画:二叉树系列 第七讲(完全二叉树的节点个数)

    在上一篇中,我们学习了解了平衡二叉树,并且利用DFS进行了验证.在本节中,我们将继续学习完全二叉树的相关内容.首先了解一下什么是完全二叉树. 01 完全二叉树 完全二叉树由满二叉树引出,先来了解一下什 ...

  7. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

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

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

  9. 二叉搜索树(BST)删除节点--思路清晰

    前言:在学习BST时,发现查找插入等操作都很好理解和实现,而删除节点的操作情况比较复杂,故通过自己的理解整理如下,本文适合初学者理解并自己动手实现BST删除操作. 在很多文章中提到,删除节点可以考虑以 ...

最新文章

  1. Python 爬取图片链接并且解析
  2. vue cli3.3 以上版本配置vue.config.js
  3. 学Python做人工智能的前景怎么样?如何入行?
  4. influx生产部署重要配置
  5. iPhone上运行Linux也要来了
  6. tf.nn.softmax
  7. 面试被问线程池,真香
  8. 计算机网络环境中学科教学,浅谈基于计算机网络环境下的农村小学的科学学科教育...
  9. matlab着重标出某个点,MATLAB与数学实验讲义资料.doc
  10. 异步IO框架实现之完成端口(Completion Port)
  11. 硬件基础知识和典型应用-关于485方式通信
  12. html5客户端页面,iphoneX 适配客户端H5页面的方法教程
  13. win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
  14. 容量规划和Region配置
  15. #今日论文推荐#CVPR 2022 | 道高一尺,魔高一丈,ConvNet还是ViT?
  16. 注解—— java.lang.annotation.Annotation
  17. Transform.setIdentity()invert()transpose()
  18. Python基于二维码实现的在线编解码系统
  19. 2021象山中学高考成绩查询,2019年象山中学高考喜报、二本上线人数1424人
  20. python蓝牙的使用

热门文章

  1. signature=e4198950218cedc4f710fd00a321e40b,杜鸣心与《水草舞》
  2. webapi2学习笔记
  3. 没有基础半路学编程,靠谱吗?
  4. 人脸识别选这几家就对了!
  5. arcgis 栅格计算器(Spatial Analyst/Raster Calculator)
  6. 计算机教学在语文中应用,计算机在语文教学中的应用.doc
  7. 男人的魅力不在于财富,而在于精神深度
  8. mysql常见数据库设计_MySQL数据库常用架构设计
  9. Python爬虫入门——爬取贴吧图片
  10. 苹果电脑双系统如何切换,CrossOver兼容双系统无需切换轻松帮你解决