我使用二叉搜索树来保存用户输入的字符串。我想获得与给定字符串范围匹配的字符串总数。但是,我当前的代码无法正确添加字符串数。
我使用递归来帮助我计算start
和end
范围内的字符串数量。例如,它通过计数两次,但我的最终输出是1而不是2.这是我的代码:
private int matchQuery(BST T, String START, String END, int count) {
if (T == null) return count;
// Go left of tree
matchQuery(T.left, START, END, count);
if(T.key != null && withinStartRange(T.key, START)) {
count++;
}
// Go right of tree
return matchQuery(T.right, START, END, count);
}
答案 0 :(得分:2)
我认为问题可能是你只返回递归树的右侧,所以如果左边的数量增加,就会忘记它。相反,您可以尝试通过以下方式更改return语句:
private int matchQuery(BST T, String start, String end, int count) {
if (T == null) return count;
if(T.key != null && withinStartRange(T.key, start)) {
count++;
}
// Go right of tree
int rightCount = matchQuery(T.right, start, end, count);
// Go left of tree
int leftCount = matchQuery(T.left, start, end, count);
return rightCount + leftCount - count;
}
这应计算" Count"中的所有增加。希望这可以帮助。
修改:我还从已退回的金额中减去了计数,因为当前通话的计数被计算两次。
Edit2:我的建议仍然有效 - OP不会返回树的左侧。稍微改变了我的代码。
答案 1 :(得分:2)
我认为计数参数对于Bloodworth方法是没用的,因为他每次都取消它...
我会去
private int matchQuery(BST bst, String start, String end) {
if (bst == null) return 0;
int count = 0;
if (bst.key != null && withinRange(bst.key, start, end)) count++;
count += matchQuery(bst.right, start, end);
count += matchQuery(bst.left, start, end);
return count;
}
我还修复了一些细节(命名约定等)。这有效,但是这没有考虑数据结构的属性。实际上,当您在特定节点上时,您知道其左侧的所有节点都低于它,并且其右侧的所有节点都更高。因此,当您知道它们超出范围时,您有时可以阻止自己探索某些节点。 我假设在他的代码中我们总是node.left.key < node.key < node.right.key
。我还假设范围包含两端
// I assume start <= end has already been checked
private int matchQuery(BST bst, String start, String end) {
if (bst == null) return 0;
if (bst.key == null) return matchQuery(bst.left, start, end) + matchQuery(bst.right, start, end);
int count = 0;
int compareToStart = bst.key.compareTo(start);
int compareToEnd = bst.key.compareTo(end);
if (compareToStart > 0) count += matchQuery(bst.left, start, end);
if (compareToEnd < 0) count += matchQuery(bst.right, start, end);
if (compareToStart >= 0 && compareToEnd <= 0) count++;
return count;
}