我试图以递归方式调用我的Preorder和Reverse Preorder方法。这些方法适用于基于数组的二叉树,它们应该返回子树的所有元素的长度。但它们确实返回子树的第一个元素的长度。如果有人可以提供帮助,我们将不胜感激。
int left_width(vector<string>& vec, int i, int ret) {
int left = i * 2 + 1;
int right = i * 2 + 2;
ret = ret + vec[i].length();
if (left < (int)vec.size() && right <= (int)vec.size()) {
left_width(vec, left, ret);
left_width(vec, right, ret);
}
return ret;
}
int right_width(vector<string>& vec, int i, int ret) {
int right = i * 2 + 2;
int left = i * 2 + 1;
ret = ret + vec[i].length();
if (left < (int)vec.size() && right <= (int)vec.size()) {
right_width(vec, right, ret);
right_width(vec, left, ret);
}
return ret;
}
答案 0 :(得分:2)
如果我理解了您正确执行的操作,则需要捕获来自left_width
或right_width
的来电的返回值,以便在所有来电中累积。例如:
int right_width(vector<string>& vec, int i, int ret) {
int right = i * 2 + 2;
int left = i * 2 + 1;
ret = ret + vec[i].length();
if (left < (int)vec.size() && right <= (int)vec.size()) {
ret = right_width(vec, right, ret);
ret = right_width(vec, left, ret);
}
return ret;
}
当然,将“持续返回值”作为参数传递给通过计算的线程实际上并不是惯用的递归。通常你会做更像这样的事情:
int right_width(vector<string>& vec, int i) {
int right = i * 2 + 2;
int left = i * 2 + 1;
int ret = vec[i].length();
if (left < (int)vec.size() && right <= (int)vec.size()) {
ret += right_width(vec, right);
ret += right_width(vec, left);
}
return ret;
}
在这里,您只需将递归调用的所有返回值与您自己的本地值相加,然后将其返回给调用者。无需将正在进行的工作计数传递给被调用者。