一尘不染

在二进制搜索树中查找重复条目的策略

algorithm

我的BST有重复的条目。我正在尝试查找重复的条目。现在显然我可以编写一个愚蠢的算法遍历整个树,这很容易。

但是,我想写一个更有效率的书。到目前为止,这是我已经完成的工作/所想的:

假设下面的树。

      10
     /   \
    5    15
   /\    / \
  2  8   10 16
      \    \
       8   12

如果要查找所有8,则首先在10的左子树上找到8。要查找重复的子节点(如果没有右子节点),它将成为右子树的最左节点。大于该节点(8)的第一个父节点?而且,如果确实有一个正确的孩子,那么它可以在其右侧子树的最左侧节点中还是位于其左侧子树的最右侧节点中?

是否所有这些情况都可以通过一堆循环和if语句来实现?

如果没有,有什么更好的方法?有人可以帮忙吗?

谢谢

编辑:实际上我只是意识到它不能是“最左边的节点”或“最右边的节点”。这样会找到下一个最高值或上一个最低值的节点。以前是一个节点吗?

编辑2:

修复了我的BST示例。它遵循以下插入方法:

if (node == null) 
    return new NodeBST<Value>(name, value);

if (node.key().compareTo(name) > 0)
    node.setLeft(insert(node.left(), name, value));     
else
    node.setRight(insert(node.right(), name, value));

这意味着重复项将被添加到其重复项的右边。


阅读 247

收藏
2020-07-28

共1个答案

一尘不染

  1. __使用通常的二叉树搜索算法 查找 与您的密钥匹配的元素。如果找不到,请停止。
  2. 检查LH子分支。如果其键匹配,则将该键设为当前节点并重复此步骤。
  3. 现在,您使用该键在树中的第一个元素处。现在,在键相等的情况下从该节点走一棵树,例如,访问该节点,右侧的子树,父级,父级的右侧子树等,以供读者练习。
2020-07-28