我试图在Java中创建一个方法来计算包含特定值的二进制搜索树中的节点并打印出它们的内容。每个节点都包含一个具有标题的Article对象,我想在树中查找并打印包含标题中关键字的文章。但是,我不希望程序打印出超过10个(例如,1个字母的关键字可能导致程序停止或崩溃)。代码在这里:
public int traverse(String key) {
if (root == null) {
System.out.println("Empty Tree!");
return 0;
} else {
int n = traverseHelper(root, key, 0);
return n;
}
}
public int traverseHelper(Node t, String key, int n) {
if (t == null) {
return n;
} else {
if (t.data.getTitle().indexOf(key) >= 0 && n <= 10) {
System.out.println(t.data);
n++;
}
return traverseHelper(t.left, key, n) + traverseHelper(t.right, key, n);
}
}
我试图保持程序打印数据的次数,但我不完全确定如何。目前,该程序打印所有事件,或非常接近它。我知道我的递归方法出了问题(我从来都不擅长递归),所以我很高兴能够很好地解释我做错了什么。这是家庭作业,所以我不期待一个明确的解决方案。 还有一些其他的东西:遍历功能的目的是打印出文章,所以我很可能以后将它改为void方法。它目前应该返回打印的最终文章数。此外,树的设置与任何其他BST一样,但如果有必要,我会对我的代码作出任何澄清。
谢谢!
答案 0 :(得分:0)
我看到的问题是n
变量。
你做
return traverseHelper(t.left, key, n) + traverseHelper(t.right, key, n);
因此,如果n
开始为5,那么即使没有找到任何项目,您的方法也会返回10(每个分支5个)。
使函数仅返回子树中找到的项目数。
答案 1 :(得分:0)
由于你用n计算,你只能将n传递给其中一个叶子,或者你可以像这样嵌套:
public int traverseHelper(Node t, String key, int n) {
if (t == null) {
return n;
} else {
if (t.data.getTitle().indexOf(key) >= 0 && n <= 10) {
System.out.println(t.data);
n++;
}
return traverseHelper(t.left, key, traverseHelper(t.right, key, n));
}
}
像这样嵌套会略微减少堆栈使用量,因为您没有额外添加而左侧变成尾部调用。 Java没有tail call optimization,但写起来并没有什么坏处。