ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第39期:小白一看就会的 BST 删除!

2021-01-27 23:07:11  阅读:141  来源: 互联网

标签:39 Right return 删除 BST 小白 root 节点 Left


我准备了 1000 本电子书和计算机各领域高清思维导图 100 张,下方扫码回复【资源】,即可获取!更可回复【内推】加入 BAT 内推群!

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

下面我们仍然通过例题进行讲解。

01、题目分析


第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)的特性:

  • 若它的左子树不为空,则所有左子树上的值均小于其根节点的值
  • 若它的右子树不为空,则所有右子树上的值均大于其根节点得值
  • 它的左右子树也分别为二叉搜索树

如下图就是一棵典型的BST:
第39期:小白一看就会的 BST 删除!

03、图解分析


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

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

第39期:小白一看就会的 BST 删除!
2、待删除的节点右子树为空,让待删除节点的左子树替代自己。
第39期:小白一看就会的 BST 删除!

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

第39期:小白一看就会的 BST 删除!
或者比当前节点大的最小节点(后继),来替换自己。
第39期:小白一看就会的 BST 删除!

分析完毕,我们一起看代码怎么实现吧。

04、GO语言示例

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

func deleteNode(root *TreeNode, key int) *TreeNode {
    if root == nil {
        return nil
    }
    if key < root.Val {
        root.Left = deleteNode( root.Left, key )
        return root
    }
    if key > root.Val {
        root.Right = deleteNode( root.Right, key )
        return root
    }
    //到这里意味已经查找到目标
    if root.Right == nil {
        //右子树为空
        return root.Left
    }
    if root.Left == nil {
        //左子树为空
        return root.Right
    }
    minNode := root.Right
    for minNode.Left != nil {
        //查找后继
        minNode = minNode.Left
    }
    root.Val = minNode.Val
    root.Right = deleteMinNode( root.Right )
    return root
}

func deleteMinNode( root *TreeNode ) *TreeNode {
    if root.Left == nil {
        pRight := root.Right
        root.Right = nil
        return pRight
    }
    root.Left = deleteMinNode( root.Left )
    return root
}

执行结果:
第39期:小白一看就会的 BST 删除!

标签:39,Right,return,删除,BST,小白,root,节点,Left
来源: https://blog.51cto.com/15076236/2608519

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有