假设BST的高度为h。 如果我们想删除一个有两个孩子的节点,那么该过程的时间复杂度是多少。
我知道在普通的二叉树中,删除的时间复杂度是O(h); O(n)最坏情况和O(logn)最佳情况。但由于我们正在用它的右子树的最小节点替换删除节点的密钥,因此找到最小密钥需要更多的时间。
那么有人知道如何解释这种情况下的时间复杂性吗?
答案 0 :(得分:4)
来源维基百科:
有三种可能的情况需要考虑:
删除一个叶子(没有子节点的节点):删除一个叶子很简单,因为我们可以简单地从树中删除它。
删除包含一个孩子的节点:删除该节点并将其替换为其子节点。
从二叉搜索树中删除带有两个子节点的节点。首先,识别左子树中最右边的节点,即前序6。其值将复制到要删除的节点中。然后可以轻松删除有序的前任,因为它最多只有一个孩子。相同的方法使用标记为9的inorder后继对称工作。
对于双子案例的每个实例,一直使用有序后继或有序前导可能会导致不平衡树,因此某些实现会在不同时间选择一个或另一个。
虽然此操作并不总是将树遍历到叶子,但这始终是可能的;因此,在最坏的情况下,它需要与树的高度成比例的时间。即使节点有两个子节点,它也不需要更多,因为它仍然遵循单个路径并且不会访问任何节点两次。因此,所有三种情况下的指针调整都需要恒定的时间。
有用的链接: