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

时间:2014-12-15 06:10:30

标签: java time-complexity binary-search-tree

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

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

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

1 个答案:

答案 0 :(得分:4)

来源维基百科:

删除

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

  • 删除一个叶子(没有子节点的节点):删除一个叶子很简单,因为我们可以简单地从树中删除它。

  • 删除包含一个孩子的节点:删除该节点并将其替换为其子节点。

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

enter image description here从二叉搜索树中删除带有两个子节点的节点。首先,识别左子树中最右边的节点,即前序6。其值将复制到要删除的节点中。然后可以轻松删除有序的前任,因为它最多只有一个孩子。相同的方法使用标记为9的inorder后继对称工作。

对于双子案例的每个实例,一直使用有序后继或有序前导可能会导致不平衡树,因此某些实现会在不同时间选择一个或另一个。

运行时分析:

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

有用的链接: