繁体   English   中英

在修改后的二进制搜索树上搜索,插入和删除

[英]Search, Insert, and Deletion on modified binary search tree

假设二叉搜索树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

显然,由于对二进制搜索树的修改,我们无法使用zp。 已经建议实现一个可以找到父对象的子例程,但是我看不到如何做到这一点。

搜索不会受到影响

答案草图

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

对于删除,如果在x.successor中存储指向后继节点的指针,则变得很简单,只需将要删除的节点的密钥替换为后继的密钥,将node.successor指针替换为后继的指针即可。 如果仅存储密钥,则需要更新以该节点为后继节点的节点。 如果有子节点,则候选者是此子树中最右边的节点。 如果不是,请搜索该节点,然后将您移至右子节点的最后一个节点作为必需节点。

我不知道如何在这里绘制图,使用图更简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM