假设二叉搜索树x中的每个节点都保留x.successor而不是x.parent。使用在O(h)中运行的伪代码描述搜索,插入和删除算法,其中h是树的高度。 到目前为止,我认为用于搜索的简单二叉搜索树算法仍然适用。
TREE-SEARCH(x, k)
if x == NIL or k == x.key
return x
if k < x.key
return TREE-SEARCH(x.left, k)
else return TREE-SEARCH(x.right, k)
此算法不受修改的影响,并且在O(h)时间内明确运行。但是,对于插入和删除算法,修改会改变执行这些操作的简单方法。例如,下面是使用普通二进制搜索树T
进行插入的算法TREE-INSERT(T,z)
y = NIL
x = T.root
while x =/= NIL
y = x
if z.key < x.key
x = x.left
else x = x.right
z.p = y
if y == NIL
T.root = z //Tree T was empty
elseif z.key < y.key
y.left = z
else y.right = z
显然我们不能使用z.p,因为我们修改了二叉搜索树。有人建议找到父程序的子程序,但我不知道如何做到这一点。
答案 0 :(得分:0)
搜索将不受影响
回答草图
插入时,我们想要新插入节点的后继者。如果您知道普通二进制搜索树中后继算法的算法,您就会知道在叶节点处,后继者是其左子节点是该节点的祖先的第一个祖先。因此,在正常插入时,我们遵循的左子节点的最后一个节点将是节点的后继节点。在此插入路径上,您跟随正确子项的最后一个节点将是其后继节点是当前节点的节点。
对于删除,如果在x.successor中存储指向后继节点的指针,则它变得简单,只需用继承者的键替换要删除的节点的键,使用后继指针替换node.successor指针。如果您只是存储密钥,则需要更新将此节点作为后续节点的节点。候选者如果有左子女,则是该子树中最右边的节点。如果没有,则搜索节点,移动到右侧子节点的最后一个节点将成为所需节点。
我不知道如何在这里绘制图表,图表更简单。