我正在编写一个bst函数,它将给定范围内的所有键存储为String:
String rangeToString(TreeNode root,int low, int high, String result){
if(root==null) return "";
if(root.key>low)) rangeToString(root.leftChild, low, high,result);
if(root.key>=low && root.key.<=high) result+=root.key;
if(root.key<high) rangeToString(root.rightChild,low,high,result);
return result;
}
我基本上是在进行顺序遍历,当它们在范围内时为字符串添加值。 目前它返回一个只包含根密钥的字符串。 我知道问题出在我的return语句中,但我似乎无法在没有它们的情况下实现该函数。 有人能指出我正确的方向吗?
答案 0 :(得分:0)
首先,您可能希望在递归调用中包含一个返回值,因为您将返回递归的结果:
String rangeToString(TreeNode root,int low, int high, String result){
if(root==null) return "";
if(root.key>low)) return rangeToString(root.leftChild, low, high,result);
if(root.key>=low && root.key.<=high) result+=root.key;
if(root.key<high) return rangeToString(root.rightChild,low,high,result);
return result;
}
我怀疑你的情况,所以我会花一些时间来研究那些......实际上,递归的回报正在假设你的条件结构。
另外,收集非常直观参数的一种方法是使用尾递归并在参数中累积结果。
您可以在这里阅读更多内容: http://en.wikipedia.org/wiki/Tail_call
关键是您自己使用参数来收集结果,当您的功能完成后,您将返回参数(累积结果的参数)。
答案 1 :(得分:0)
你可以将一个补充的“累积到现在”的字符串列表(比如你的名字curlist
)传递给你的论据。然后当你返回时返回这个curlist argument + .Add(your found key for this recursion level)
并在你递归调用fonction(rangeToString
)的地方你将结果连接到当前列表curlist
(使用Append或其他)。
伪代码:
list<string> myRecursiveFunc(some args, list<string> curlist)
{
if (recursConditionOK)
curlist = curlist.Append(myRecusriveFunc, curlist);
return curlist;
}