我的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));
这意味着重复项将被添加到其重复项的右边。