Algorithm 在修改的二叉搜索树上搜索、插入和删除

Algorithm 在修改的二叉搜索树上搜索、插入和删除,algorithm,binary-tree,binary-search-tree,Algorithm,Binary Tree,Binary Search Tree,假设二叉搜索树x中的每个节点都保留x.succession而不是x.parent。描述使用伪代码的搜索、插入和删除算法,伪代码在Oh中运行,其中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)

假设二叉搜索树x中的每个节点都保留x.succession而不是x.parent。描述使用伪代码的搜索、插入和删除算法,伪代码在Oh中运行,其中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)
该算法应不受修改的影响,并在很短的时间内运行。然而,对于Insert和Delete算法,修改改变了执行这些操作的简单方法。例如,这里是使用普通二叉搜索树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,因为我们修改了二进制搜索树。有人建议实现一个查找父对象的子例程,但我不知道如何实现。搜索将不受影响

答案简略

插入时,我们需要新插入节点的后续节点。如果您知道普通二叉搜索树中后继节点的算法,您就会知道在叶节点上,后继节点是第一个祖先,其左子节点是该节点的祖先。因此,在执行正常插入时,我们跟随其左子节点的最后一个节点将是该节点的后续节点。在此插入路径上,跟随右子节点的最后一个节点将是其后续节点是当前节点的节点

对于删除,如果在x.succession中存储指向后续节点的指针,那么就很简单了,只需将要删除的节点的键替换为后续节点的键,将node.succession指针替换为后续节点的指针。如果只是存储密钥,则需要更新将此节点作为后续节点的节点。候选节点(如果它有一个左边的子节点)是该子树中最右边的节点。如果没有,则搜索该节点,移动到右侧子节点的最后一个节点将是所需的节点


我不知道如何在这里画图表,用图表更简单

我认为对于插入例程,我们更愿意说后继节点是我们跟随其左子节点的最后一个节点。