【发布时间】:2011-12-04 04:09:05
【问题描述】:
我有一个包含重复条目的 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));
这意味着重复项将被添加到其重复项的右侧.. 对吗?
【问题讨论】:
-
你事先知道你要找什么号码吗?
-
这不是违背了 BST 的目的吗?
-
这不是正确的 BST。根 10 的右分支上不能有 8。
-
@lynks 是的 - 你得到了你想要删除的号码。
-
@John Kugelman 哦,没错!让我解决这个问题。对不起
标签: java algorithm binary-tree