我搜索了一段時間SOF和閱讀類似的帖子。我沒有發現任何這些答案令人滿意。我遇到的問題是我想遍歷樹,直到「根節點」和目標節點相同。如果'root'==目標,我想返回true否則爲false。爲了遍歷遞歸循環
這是我
private boolean modifiedInorderTraversal(Node newRoot, Node target){
if(newRoot.leftPointer != null){
modifiedInorderTraversal(newRoot.leftPointer, target);
}
if(newRoot == target){
System.out.println("newRoot == target");
return true;
//return false;
}
if(newRoot.rightPointer != null){
modifiedInorderTraversal(newRoot.rightPointer, target);
}
System.out.println("before false return");
//return true;
return false;
}
你會發現註釋掉是返回FALSE,返回true。如果我交換回報,我可以讓程序正常運行所有測試用例。但是,我個人不喜歡這個解決方案。我添加了打印語句來跟蹤哪些問題,並將Netbeans用作我的調試器。當我運行代碼時,它確實顯示它正在輸入
if(newRoot == target){
System.out.println("newRoot == target");
return true;
//return false;
}
我知道這是因爲我的行被打印出來。現在看來,儘管返回語句爲true,我的遞歸仍然繼續,導致虛假返回。我試過使用全局變量來阻止遞歸無濟於事。 該嘗試的示例
private breakRecursion = false;
private boolean example(Node newRoot, Node target){
if(!breakRecursion){
if(blah blah){recurse}
if(newRoot == target){breakRecursion = true, return true}
if(blah blah){recurse}
return false;
}
}
任何想法?我讀過一個可以使用例外的循環,但我認爲這也很麻煩。
***********************更新********************* 我找到了這工作的方式我期望它
private boolean found = false;
private boolean modifiedInorderTraversal(Node newRoot, Node target){
if(newRoot.leftPointer != null){
modifiedInorderTraversal(newRoot.leftPointer, target);
}
if(newRoot == target){
found = true;
}
if(newRoot.rightPointer != null){
modifiedInorderTraversal(newRoot.rightPointer, target);
}
return found;
}
我對這個解決方案的唯一問題是,運行時是O(n)。最壞的情況應該是O(n),但是這種解決方案不會提前中斷並遍歷所有節點,無論目標是在哪找到的。
但它發現目標後繼續遍歷樹。添加&&!發現if語句,如果您檢查的是左側和右側子空白。如果你想保持一致,那麼在函數中發現聲明,從遞歸調用中分配返回的值,並在找到的最後返回值。 –