【问题标题】:Time complexity of deletion in binary search tree二叉搜索树中删除的时间复杂度
【发布时间】:2014-12-15 06:10:30
【问题描述】:
假设 BST 的高度为 h。
如果我们想删除一个有两个孩子的节点,那么这个过程的时间复杂度是多少。
我知道在正常的二叉树中,删除的时间复杂度是O(h); O(n) 最坏情况和 O(logn) 最好情况。但是由于我们将删除节点的键替换为它的右子树的最小节点,因此找到最小键需要更多时间。
那么有人知道如何解释这种情况下的时间复杂度吗?
【问题讨论】:
标签:
java
time-complexity
binary-search-tree
【解决方案1】:
来源维基百科:
删除
需要考虑三种可能的情况:
从二叉搜索树中删除具有两个子节点的节点。首先,识别左子树中最右边的节点,即顺序前驱 6。它的值被复制到被删除的节点中。然后可以轻松删除 inorder 前驱,因为它最多有一个孩子。同样的方法使用标记为 9 的中序后继对称地工作。
对两个孩子案例的每个实例始终使用有序后继或有序前驱可能会导致树不平衡,因此某些实现会在不同时间选择其中一个。
运行时分析:
虽然这个操作并不总是遍历树到叶子,但这总是有可能的;因此在最坏的情况下,它需要的时间与树的高度成正比。即使节点有两个孩子,它也不需要更多,因为它仍然遵循单一路径并且不会两次访问任何节点。因此,这三种情况下的指针调整都需要恒定的时间。
有用的链接: