我们是否可以在平衡二叉搜索树上执行m插入和删除操作,以便删除操作删除节点及其下面的整个子树,然后平衡它?整个过程是以每步的摊销O(log n)时间完成的吗?
答案 0 :(得分:0)
简短回答:是的,这是可能的。
您所描述的是自平衡二叉树,如AVL树或红黑树。两者都取O(log n)进行删除,其中包括重新排序节点。 Here是指向描述此类树木的页面的链接,以及它们如何比我更详细地工作,包括插图。您还可以查看Wikipedia page of AVL-trees,它们有一个不错的解释以及插入的动画。以下是您最感兴趣的简短版本:
AVL树中的删除平均为O(log n),重新平衡平均为O(log n),最差情况为O(1)。这是通过轮换完成的,同样在两个来源中都有很好的解释。
维基百科页面还包含一些代码,如果您需要实现它。
修改强>
要删除子树,您仍然可以执行相同的操作。 Here是对此的非常好解释的链接。短版本:删除子树可以做O(log n)(记住删除,不管删除的节点数是多少(log n),只要你不直接重新平衡树),那么树会使用旋转来重新平衡自己。这也可以改变树的根。删除整个子树当然会创建一个更大的高度差异,而不仅仅是删除树末端的一个节点。仍然,使用旋转树可以通过找到第一个节点不平衡然后执行AVL重新平衡方案来重新平衡。由于使用了旋转,这应该仍然是O(log n)。 Here你会发现树在删除后如何重新平衡,这会造成高度不平衡。