二叉搜索树中删除的时间复杂度

Posted

技术标签:

【中文标题】二叉搜索树中删除的时间复杂度【英文标题】:Time complexity of deletion in binary search tree 【发布时间】:2014-12-15 06:10:30 【问题描述】:

假设 BST 的高度为 h。 如果我们想删除一个有两个孩子的节点,那么这个过程的时间复杂度是多少。

我知道在正常的二叉树中,删除的时间复杂度是O(h); O(n) 最坏情况和 O(logn) 最好情况。但是由于我们将删除节点的键替换为它的右子树的最小节点,因此找到最小键需要更多时间。

那么有人知道如何解释这种情况下的时间复杂度吗?

【问题讨论】:

【参考方案1】:

来源***:

删除

需要考虑三种可能的情况:

删除叶子(没有子节点的节点):删除叶子很容易,因为我们可以简单地将其从树中移除。

删除一个有一个子节点的节点:删除该节点并用它的子节点替换它。

删除具有两个子节点的节点: 调用要删除的节点 N。不要删除 N。而是选择它的有序后继节点或其有序前驱节点 R。复制值从 R 到 N,然后在 R 上递归调用 delete,直到达到前两种情况之一。如果你选择一个节点的有序后继,因为右子树不是 NIL(我们现在的情况是节点有 2 个孩子),那么它的有序后继是它的右子树中值最小的节点,它将有最多 1 个子树,因此删除它属于前 2 种情况之一。

从二叉搜索树中删除具有两个子节点的节点。首先,识别左子树中最右边的节点,即顺序前驱 6。它的值被复制到被删除的节点中。然后可以轻松删除 inorder 前驱,因为它最多有一个孩子。同样的方法使用标记为 9 的中序后继对称地工作。

对两个孩子案例的每个实例始终使用有序后继或有序前驱可能会导致树不平衡,因此某些实现会在不同时间选择其中一个。

运行时分析:

虽然这个操作并不总是遍历树到叶子,但这总是有可能的;因此在最坏的情况下,它需要的时间与树的高度成正比。即使节点有两个孩子,它也不需要更多,因为它仍然遵循单一路径并且不会两次访问任何节点。因此,这三种情况下的指针调整都需要恒定的时间。

有用的链接:

http://en.wikipedia.org/wiki/Binary_search_tree#Deletion http://cse.iitkgp.ac.in/~pb/algo-1-pb-10.pdf

【讨论】:

以上是关于二叉搜索树中删除的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二叉树 - 二叉搜索树》中等05 —— LeetCode 450. 删除二叉搜索树中的节点

LeetCode 二叉树专项删除二叉搜索树中的节点(450)

Leetcode 450.删除二叉搜索树的节点

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

二叉排序树中插入一个结点的时间复杂度是多少

#yyds干货盘点# 解决剑指offer:二叉搜索树与双向链表