如何在java中递归添加计数?

时间:2015-08-30 10:29:25

标签: java recursion

我使用二叉搜索树来保存用户输入的字符串。我想获得与给定字符串范围匹配的字符串总数。但是,我当前的代码无法正确添加字符串数。

我使用递归来帮助我计算startend范围内的字符串数量。例如,它通过计数两次,但我的最终输出是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); 
    }

2 个答案:

答案 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;    
}