我尝试使用它的标签搜索节点,并在目标节点下添加一个新节点, 当我尝试使用递归来搜索它时,它总是返回错误的目标或返回null。 有谁知道如何解决它?
public TreeNode getNodeReference(String label){
if(left!=null){
if(check(left,label)==true)
return left;
left.getNodeReference(label);
}
if(middle!=null){
if(check(middle,label)==true)
return middle;
middle.getNodeReference(label);
}
if(right!=null)
{ if(check(right,label)==true)
return right;
right.getNodeReference(label);
}
return null;
}
public boolean check(TreeNode tree,String label){
if(tree.getLabel().equals(label))
return true;
else return false;
}
答案 0 :(得分:1)
问题是: 你没有对内部调用的返回值做任何事情。
例如:
...检查
...
X。 return null;
BOOM!
答案 1 :(得分:0)
如果您实际跟踪代码,您可以非常清楚地了解为什么它会返回错误的结果。如果树的第一级子节点都没有与标签匹配(假设左/中/右都是非空的),我在下面标记了代码路径:
public TreeNode getNodeReference(String label){
if(left!=null){ // 1: left is not null
if(check(left,label)==true) // 2: no match, proceed to 3
return left;
left.getNodeReference(label); // 3: called, but why? no side effect, no return.
}
if(middle!=null){ // 4
if(check(middle,label)==true) // 5
return middle;
middle.getNodeReference(label); // 6
}
if(right!=null) { // 7
if(check(right,label)==true) // 8
return right;
right.getNodeReference(label); // 9
}
return null; // 10: and finally we're here and we return null
}
基本上,你调用child.getNodeReference(label),但这就是你所做的一切。你叫它。然后丢弃返回的值并继续,因此您的搜索实际上永远不会超出您最初调用getNodeReference的节点的第一级。
首先,对于初学者来说,这种一般模式就是你想要的:
if (child != null) {
if (check(child, label))
return child; // match found
TreeNode childResult = child.getNodeReference(label);
if (childResult != null)
return childResult; // match found deeper in tree; this is what you did not do.
}
也就是说,这是一个较短的实现(请记住,这不是完全就像你所拥有的那样,因为你的实现也跳过了检查第一次调用getNodeReference的实际节点): / p>
public TreeNode getNodeReference (String label) {
if (check(this, label))
return this;
TreeNode childResult = null;
if (left != null)
childResult = left.getNodeReference(label);
if (childResult == null && middle != null)
childResult = middle.getNodeReference(label);
if (childResult == null && right != null)
childResult = right.getNodeReference(label);
return childResult;
}
一般情况下,您应该坐下来,仔细查看代码,然后逐步执行一行。通常,当你这样做时,这样的问题就变得清晰了。
希望有所帮助。