我一直想为我的二进制搜索树(恰好是数组表示)编写remove()
方法。但在写之前,我必须考虑所有情况。省略所有情况(因为它们很简单),除非节点有两个子节点,在我到目前为止所读到的所有解释中,我看到的大多数情况都从已经平衡的二叉搜索树中删除了一个元素。在我看到从不平衡二叉搜索树中删除元素的少数情况下,我发现它们通过zigs和zags进行平衡,然后删除元素。
有没有办法可以从不平衡的二进制搜索树中删除一个元素,而不必事先进行平衡?
如果没有,编写AVL树(以数组表示形式)会更容易吗?
答案 0 :(得分:3)
你不需要平衡它,但是你需要递归地在树上执行一些交换,这样你实际上最终得到了有效的BST。
删除(不平衡)BST中有2个孩子的节点:(来自Wikipedia)
调用要删除的节点N.不要删除N.而是选择其有序后继节点或其有序前导节点R.将R的值复制到N,然后在R上递归调用delete直到达到前两个案例中的一个。
从二叉搜索树中删除具有两个子节点的节点。首先,识别左子树中最右边的节点,即前序6。其值将复制到要删除的节点中。然后可以轻松删除有序的前任,因为它最多只有一个孩子。相同的方法使用标记为9的顺序后继对称工作。
虽然,为什么你想要一棵不平衡的树?它上面的所有操作都需要更长的时间(或者至少一样长),并且平衡的额外开销不会改变任何操作的渐近复杂性。并且,如果您正在使用数组表示,其中索引i
处的节点具有索引2i
和2i+1
处的子节点,则它可能会相当稀疏,即将会相当一点浪费的记忆。