我已经尝试为二进制树的递归顺序,预订,后期遍历创建堆栈,而且我做得非常好。在其他情况下,例如,对于测试用例,我的回答应该是'true',比如说。例如,
boolean method(root)
{
// more code
method(root.left());
method(root.right());
}
,某处,方法调用(root.left())返回false,方法调用(root.right())返回true应该是我们的答案。但是由于方法调用(root.left())首先在某个地方完成,所以在它执行之间,它可能返回false。那么我们如何从方法(root.right())得到我们的结果为真?我认为它与堆栈的形成方式有关,并且当递归调用以这种方式发生时,返回方法的值。如果我错了,请解释它并纠正我。
答案 0 :(得分:0)
您需要返回值。该方法需要在其逻辑中使用返回的值来停止/继续搜索。
你需要让基本案例返回true为false。然后在进行第一次递归调用时,如果结果为true,则只需要执行第一次递归调用。如果需要,第二次递归调用将是该方法的结果。因此,你正在看这样的事情:
boolean method(root)
{
if( root == null ) { // base case 1
return false;
}
if( root.value == someValue ) { // base case 2, what should be a positive
return true;
}
// default search left first and return true if true
if( method(root.left()) ) {
return true;
}
// default search right and return true if true
if( method(root.right()) ){
return true;
}
// return false since neither recursive calls were true
return false;
}
这非常详细,可以这样写出来:
boolean method(root)
{
return root != null && ( root.value == someValue ||
method(root.left()) ||
method(root.right()));
}
我发现最后一个更具可读性,但是新手可能会发现更详细的第一个更清晰。
在第一次递归调用之后的被调用者恢复操作中(也可能有它的一部分调用)并继续它的逻辑并在需要时在右侧进行递归。
不要关心系统堆栈。关心基础案例并测试它们。然后执行最简单的增加复杂性来执行默认情况,以便在递归调用中看到问题变小。从简单到复杂的过程要好得多,而不是尝试通过从一棵大树开始查看发生在非常深的递归回合中的事情来解决这些问题。