コードを実際にトレースすると、誤った結果が返される理由が明確にわかります。ツリーの最初のレベルの子のいずれもラベルと一致しない場合は、以下のコード パスにマークを付けました (左/中央/右がすべて非 null であると仮定します)。
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 が最初に呼び出された実際のノードのチェックもスキップしたため、これはあなたが持っていたものとまったく同じではないことに注意してください):
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;
}
一般に、腰を落ち着けてコードをよく見て、一度に 1 行ずつ実行する必要があります。通常、それを行うと、このような問題が明らかになります。
それが役立つことを願っています。