首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

二进制搜索树删除节点函数不删除

二进制搜索树(Binary Search Tree,BST)是一种常见的数据结构,它具有快速的搜索和插入操作。在二进制搜索树中,每个节点都有一个键值,且左子树的键值小于节点的键值,右子树的键值大于节点的键值。

删除节点是二进制搜索树中的一个常见操作,可以通过以下步骤来实现:

  1. 首先,需要找到要删除的节点。从根节点开始,比较要删除的节点的键值与当前节点的键值。如果相等,则找到了要删除的节点;如果要删除的节点的键值小于当前节点的键值,则继续在左子树中查找;如果要删除的节点的键值大于当前节点的键值,则继续在右子树中查找。
  2. 找到要删除的节点后,需要考虑三种情况:
    • 如果要删除的节点没有子节点,即为叶子节点,则可以直接删除该节点。
    • 如果要删除的节点只有一个子节点,则将该子节点替换为要删除的节点。
    • 如果要删除的节点有两个子节点,则需要找到该节点的后继节点(即右子树中最小的节点),将后继节点的值复制到要删除的节点中,并删除后继节点。
  • 在删除节点后,需要保持二进制搜索树的性质。如果删除的节点是根节点,则可以直接删除;否则,需要将删除节点的父节点指向删除节点的子节点。

以下是一个示例的二进制搜索树删除节点函数的实现(使用Python语言):

代码语言:txt
复制
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def deleteNode(root, key):
    if not root:
        return root
    
    # 找到要删除的节点
    if key < root.val:
        root.left = deleteNode(root.left, key)
    elif key > root.val:
        root.right = deleteNode(root.right, key)
    else:
        # 没有子节点或只有一个子节点的情况
        if not root.left:
            return root.right
        elif not root.right:
            return root.left
        
        # 有两个子节点的情况,找到后继节点
        successor = root.right
        while successor.left:
            successor = successor.left
        
        # 将后继节点的值复制到要删除的节点中
        root.val = successor.val
        
        # 删除后继节点
        root.right = deleteNode(root.right, successor.val)
    
    return root

这个函数可以用于删除二进制搜索树中的指定节点。它的时间复杂度为O(log n),其中n是二进制搜索树中的节点数。

二进制搜索树的删除节点函数可以在各种应用场景中使用,例如在数据库中删除记录、在搜索引擎中删除索引等。

腾讯云提供了多个与云计算相关的产品,其中包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据实际需求和使用情况来确定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

二叉搜索删除节点 动画演示

Day60:删除二叉搜索的某个节点 1 题目 给定一个二叉搜索的根节点 root 和一个值 key,删除二叉搜索中的 key 对应的节点,并保证二叉搜索的性质不变。...返回二叉搜索(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除节点; 如果找到了,删除它。 说明:要求算法时间复杂度为 O(h),h 为的高度。...:选择以nodei.right为根节点中最左侧节点,然后替换nodei 最后返回 nodei....__delNodei(root,key),这个方法的构思思路是这样: 第一个参数是BST中的任意节点,因为BST严格满足递归,所以选取任意一个以节点nodei为根的删除里面等于key的节点。...__delNodei(nodei.left,key) # 删除后返回nodei.left节点的引用 以下面二叉搜索删除值等于3的节点为例演示,伸入到左子树: ?

1.1K20

如何删除二叉搜索中的节点

二叉搜索删除节点就涉及到结构调整了!...,删除二叉搜索中的 key 对应的节点,并保证二叉搜索的性质不变。...递归 递归三部曲: 确定递归函数参数以及返回值 说道递归函数的返回值,在二叉搜索中的插入操作中通过递归返回值来加入新节点, 这里也可以通过递归返回值删除节点。...第五种情况有点难以理解,看下面动画: 450.删除二叉搜索中的节点 动画中颗二叉搜索中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。...因为二叉搜索添加节点只需要在叶子上添加就可以的,涉及到结构的调整,而删除节点操作涉及到结构的调整。 这里我们依然使用递归函数的返回值来完成把节点从二叉中移除的操作。

1.3K30

二叉删除节点

算法: 1.后驱算法: /* 递归解法: 1.找到需要删除节点 2.删除节点只有右子树或者左子树,直接将右子树或者左子树的根节点当作这个删除节点 3.删除节点左右子树都存在的情况下,左子树的最大节点也叫做前驱当作删除节点..., 或者将右子树的最小节点也就称作后驱当作删除节点。...*/ 2.前驱算法: /* 递归解法: 1.找到需要删除节点 2.删除节点只有右子树或者左子树,直接将右子树或者左子树的根节点当作这个删除节点 3.删除节点左右子树都存在的情况下,左子树的最大节点也叫做前驱当作删除节点...// 左子树不在的话,表示这个节点就是要删除的最小节点 // 存在两种情况,一:这个节点就是叶子节点,直接通过赋值为nil, 来当作删除节点。...2.删除节点只有右子树或者左子树,直接将右子树或者左子树的根节点当作这个删除节点 3.删除节点左右子树都存在的情况下,左子树的最大节点也叫做前驱当作删除节点, 或者将右子树的最小节点也就称作后驱当作删除节点

73820

排序二叉-删除节点

,排序二叉是如何删除元素的。...步骤 先找到要删除节点 targetNode 找到要删除节点的父节点 parent 一、删除叶子节点 1.确定 targetNoe 是 parent 的左子节点还是右子节点 2.根据前面的情况来对应删除...parent 的左子节点还是右子节点 3.对应删除 三、删除有两颗子树的节点 1.从 targetNode 的右子树找到最小的节点 2.用一个临时变量,将最小节点的值保存 temp 3.删除最小节点 4...); binarySortTree.infixOrder(); binarySortTree.delNode(3); System.out.println("删除之后====中序遍历二叉...* 并删除以 node 为根节点的二叉排序的最小节点 * * @param node 传入节点 * @return 以 node 为根节点的二叉排序的最小节点的值 */ public int delRightTreeMin

25210

排序二叉-删除节点

我们已经了解了什么是排序二叉以及排序二叉的遍历和添加元素,现在我们一起来看一下,排序二叉是如何删除元素的。...步骤 先找到要删除节点 targetNode 找到要删除节点的父节点 parent 一、删除叶子节点 1.确定 targetNoe 是 parent 的左子节点还是右子节点 2.根据前面的情况来对应删除...parent 的左子节点还是右子节点 3.对应删除 三、删除有两颗子树的节点 1.从 targetNode 的右子树找到最小的节点 2.用一个临时变量,将最小节点的值保存 temp 3.删除最小节点 4...); binarySortTree.infixOrder(); binarySortTree.delNode(3); System.out.println("删除之后====中序遍历二叉...* 并删除以 node 为根节点的二叉排序的最小节点 * * @param node 传入节点 * @return 以 node 为根节点的二叉排序的最小节点的值 */ public

50310

​LeetCode刷题实战450:删除二叉搜索中的节点

今天和大家聊的问题叫做 删除二叉搜索中的节点,我们先来看题面: https://leetcode-cn.com/problems/delete-node-in-a-bst/ Given a root...给定一个二叉搜索的根节点 root 和一个值 key,删除二叉搜索中的 key 对应的节点,并保证二叉搜索的性质不变。返回二叉搜索(有可能被更新)的根节点的引用。...一般来说,删除节点可分为两个步骤: 首先找到需要删除节点; 如果找到了,删除它。...递归函数,有两个要点要理解,一个是递归函数的作用,二是它返回的结果是什么。这道题里,这个递归函数的作用就是 删除一棵里的目标节点,返回的是这棵修改后的的根节点root。...(启示:说到 二叉搜索BST时,不仅要想到中序遍历的结果是排好序的,还要想到可以递归,有点像二分查找的模式寻找目标值,提高效率) 删除节点: 经过上一步的递归过程,找到了key,而且key是要调整的这个子树的根节点

31720

LeetCode 450: 删除二叉搜索中的节点 Delete Node in a BST

题目: 给定一个二叉搜索的根节点 root 和一个值 key,删除二叉搜索中的 key 对应的节点,并保证二叉搜索的性质不变。返回二叉搜索(有可能被更新)的根节点的引用。...一般来说,删除节点可分为两个步骤: 首先找到需要删除节点; 如果找到了,删除它。...5 / \ 2 6 \ \ 4 7 解题思路: 待删除节点在二叉中的三种情况有: 如果目标节点没有子节点,我们可以直接移除该目标节点。...另外二叉搜索的中序遍历结果为从小到大顺序排列的; 删除节点如果不是叶子节点时, 则应把该节点的值替换为其右子树中最小的一个节点值 (删除节点的后驱节点); 删除节点如果不是叶子节点且无右子树时, 则应把该节点的值替换为其左子树中最大的一个节点值...(删除节点的前驱节点), 并在子树中递归删除刚刚替换的节点 你会发现, 二叉搜索最小节点为该的最左叶子; 最大节点为该的最右叶子, 即: 如果 key > root.val,说明要删除节点在右子树

1.1K20

力扣 每日一题 删除二叉搜索中的节点(中等题)

一、题目描述: 给定一个二叉搜索的根节点 root 和一个值 key,删除二叉搜索中的 key 对应的节点,并保证二叉搜索的性质不变。返回二叉搜索(有可能被更新)的根节点的引用。...一般来说,删除节点可分为两个步骤: 首先找到需要删除节点;如果找到了,删除它。说明:要求算法时间复杂度为 O(h),h 为的高度。...而找到该节点是非常简单的,因为这棵是二叉搜索,而二叉搜索的特性,左节点的值一定小于该节点值,右节点的值一定大于该节点的值,所以直接搜索就可以找到该值。...第二种:对于第二种情况,直接删除节点,将左节点代替该节点。第三种:对于第三种情况:直接删除节点,将右节点代替该节点。...3.对于都有的情况,为了保证二叉搜索的结构,我们 ① :可以用该节点的左节点最右节点的值代替该节点;②:也可以用该节点的右节点的最左节点的值代替该节点

39210

Python实现二叉搜索删除功能

二叉搜索的实现可以参考:Python实现二叉搜索 本文使用 Python 实现二叉搜索删除功能,在此之前必须先知道二叉搜索的特性: 1....返回二叉搜索的高度的方法 height(root),用于判断被删除节点的第几层。...在二叉搜索中查找节点的方法 search(root, data),要从二叉搜索删除节点,首先要保证节点是属于二叉搜索的,所以先搜索节点是否在二叉搜索中。...所以,删除非叶节点时,必须从子树中选择一个节点来填补被删除节点位置,避免的断裂,也避免“牵连”到其他的节点,还要保证删除节点后的二叉依然是一棵二叉搜索,满足二叉搜索的特性。...所以无法指定节点删除,只能根据节点中存储的值,先在中进行搜索,找到了再执行删除操作。

84420

5.4删除二叉搜索的任意元素

一.删除思路分析 在删除二叉搜索的任意元素时,会有三种情况: 1.1 删除只有左孩子的节点 节点删除之后,将左孩子所在的二叉取代其位置;连在原来节点父亲元素右节点的位置,比如在图中需要删除58这个节点...1.3 删除包含左右孩子的节点 如下图,二叉搜索包含有左右孩子,假设现需要删除58这个节点。 ? 针对该种情况,分析如下: 我们把58这个节点记为d节点(包含有左子树与右子树),如下图所示: ?...针对这种节点删除情况需要把左子树与右子树融合起来,融合方法: 从d这节点的左孩子与右孩子中找一个比d节点还要大的节点取代d节点,根据二叉搜索的性质可知(左边节点<当前节点<右边节点),这个需要被找的节点存在于...二、编码实现二叉搜索的任意元素 根据上述的分析,在此基础上进行编码,删除代码如下: //从二叉搜索删除元素为e的节点 public void remove(E e) { root...= remove(root, e); } //删除以node为根的二叉搜索中值为e的节点,递归算法 //返回删除节点后更新的二叉搜索的根 private Node

54940

一篇文章搞懂红黑的原理及实现2-3-4 Tree(2-3-4)红黑左倾红黑删除操作删除红黑最小节点删除任意节点总结

首先我们介绍一下,删除完成之后,如何调整红黑为左倾的红黑?...删除的当前节点不能是2-node 如果有必要可以变换成4-node 从底部删除节点 向上的fix过程中,消除4-node 红黑删除操作与插入操作一样,极其复杂,所以先从相对容易的情况开始考虑 删除最大节点...image.png 最复杂的情况,是我们要删除节点是2-node,如果我门直接删除就会破坏红黑的平衡,所以我们再删除之前,要进行一定的变换,变成3-node或者4-node,也就是借一个或者两个节点过来...-4的性质直接删除就可以了。...,则我们可以直接利用前面最大节点和最小节点的方法往下搜索就行了,如果所删除节点比当前节点大,就往右搜索,采取删除最大节点搜索路径,反之,就往左搜索

4.3K31

单机单节点 MongoDB 为什么删除数据后释放空间?

这个引擎有一个特点,就是删除数据释放空间。例如现在你的一个集合里面有 10000000 条数据,占用 10GB 的硬盘空间。你把其中的 9999999 条数据都删了,占用空间仍然是 10GB。...如果你想释放空间,最直接的方法是删除整个集合(Drop Collection)或者删除整个数据库(Drop Database)。...如果你的 MongoDB 版本小于 4.4,但是大于等于 3.6,那么虽然删除了数据,磁盘空间不会释放,但当你插入新的数据时,MongoDB 会重用之前占有的空间,而不会继续额外占用新的磁盘空间。...例如你的集合有 10GB,你删除了 9999999 条数据,接下来,在你新插入的数据总大小超过 10GB 前,MongoDB 都不会申请额外的硬盘空间。...在 MongoDB 4.4 或以后的版本,compact 命令几乎可以在除了删除集合、增删索引外的任何时候执行。

2.1K30

数据结构与算法(九)二叉搜索删除操作

1、二叉搜索删除操作 介绍 关于二叉搜索删除操作,先弄清如何找到前驱节点和后继节点 前驱节点(predecessor) 介绍 •前驱节点:中序遍历时的前一个节点•如果左子树存在,从该节点的左子节点的最右的节点...删除节点 叶子节点 •直接删除 度为1的节点 •用子节点替换既可 度为2的节点 •找到前驱或者后继节点的值,并替换原节点。•他的前驱、后继节点的度只可能是0或者是1。...= null; } else { node.parent.right = null; } } } 2、根据遍历结果重构二叉 •中序遍历+ 前/后序遍历 •可以确定一颗唯一二叉...•前序遍历+ 后序遍历•如果他是一颗真二叉(Proper Binary Tree) ,结果是唯一的。...•其他情况 唯一。

86120

5.3 删除二叉搜索的最大元素和最小元素

在5.2中完成了的遍历,这一节中将对如何从二叉搜索删除最大元素和最小元素做介绍: 我们要想删除二分搜索的最小值和最大值,就需要先找到二分搜索的最小值和最大值,其实也还是很容易的,因为根据二叉搜索的特点...,它的左子树一定比当前节点要小,所以二叉搜索的最小值一定是左子树一直往下走,一直走到底。...一、查询操作 1.1 查询二分搜索的最小节点 // 寻找二分搜索的最小元素 public E minimum() { if (size == 0) {...return ret; } // 删除掉以node为根的二分搜索中的最小节点 // 返回删除节点后新的二分搜索的根 private Node removeMin...return node;// 删除后,根节点依然是node,返回即可 } 2.2 删除最大值 // 从二分搜索删除最大值所在节点 public E removeMax() {

1.3K00

【一起学设计模式】访问者模式实战:权限管理删除节点操作

业务背景 权限功能模块-权限-删除树上的某个权限 要求判断该权限节点及其子节点是否有用户、角色关联,如若有关联则不允许删除 要求删除该权限节点及其子节点所有数据 常规操作 先说下大多数人为了实现需求都会做的常规操作...,这里举例说明,权限A,其子节点B、C 查找权限A是否被用户、角色关联过 查找全新啊A下面所有子节点B、C 查找权限B、C是否被其他用户、角色关联过 删除A、B、C 这里如果有个流程图效果会更佳,但是相信大家看到文字也能明白其中的运转流程...private AccountPriorityRelationshipService accountPriorityRelationshipService; /** * 构造函数...getRelateCheckResult() { return relateCheckResult; } } PriorityNodeRemoveVisitor: /** * 权限树节点删除访问者...PriorityNodeRemoveVisitor extends AbstractNodeVisitor{ private PriorityService priorityService; /** * 构造函数

67410

算法:二叉排序删除节点策略及其图形化(二叉查找)

二叉排序(BST,Binary Sort Tree)具有这样的性质:对于二叉中的任意节点,如果它有左子树或右子树,则该节点的数据成员大于左子树所有节点的数据成员,且小于右子树所有节点的数据成员。...排序二叉的中序遍历结果是从小到大排列的。 二叉排序的查找和插入比较好理解,主要来看一下删除时的情况。...如果需要查找并删除如图8-6-8中的37, 51, 73,93这些在二叉排序中是叶子的结点,那是很容易的,毕竟删除它们对整棵来说,其他结点的结构并未受到影响。 ?...比如图8-6-9,就是先删除35和99两结点,再删除58结点的变化图,最终,整个结构还是一个二叉排序。 ? 但是对于要删除的结点既有左子树又有右子树的情况怎么办呢?...\n", (unsigned int)root);             printf("\t\\tree");             print_tree(root); /* 传递给函数的一直是根节点的值

1.1K90

一日一技:单机单节点 MongoDB 为什么删除数据后释放空间?

这个引擎有一个特点,就是删除数据释放空间。例如现在你的一个集合里面有10000000条数据,占用10GB 的硬盘空间。你把其中的9999999条数据都删了,占用空间仍然是10GB。...如果你想释放空间,最直接的方法是删除整个集合(Drop Collection)或者删除整个数据库(Drop Database)。...如果你的 MongoDB 版本小于4.4,但是大于等于3.6,那么虽然删除了数据,磁盘空间不会释放,但当你插入新的数据时,MongoDB 会重用之前占有的空间,而不会继续额外占用新的磁盘空间。...例如你的集合有10GB,你删除了9999999条数据,接下来,在你新插入的数据总大小超过10GB 前,MongoDB 都不会申请额外的硬盘空间。...在 MongoDB 4.4 或以后的版本,compact命令几乎可以在除了删除集合、增删索引外的任何时候执行。

2.2K10
领券