【发布时间】:2015-06-17 12:29:01
【问题描述】:
我在 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,但我的递归似乎仍在继续,导致 false 的错误返回。我尝试使用全局变量来停止递归无济于事。 该尝试的示例
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),但是这个解决方案不会提前中断,并且无论目标在哪里找到都会遍历所有节点。
【问题讨论】:
-
但是在找到目标后继续遍历树。将 && !found 添加到您检查的 if 语句是左子和右子空。如果要保持一致,则在函数中声明找到,从递归调用中分配返回值,并在最后返回找到。
标签: java recursion binary-search-tree