0

我正在尝试递归调用我的 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;

}

4

1 回答 1

2

如果我理解您的操作正确,则需要从调用left_widthright_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;
}

在这里,您只需将递归调用的所有返回值与您自己的本地值相加,然后将其返回给调用者。无需将进行中的工作倒计时传递给被调用者。

于 2013-11-09T09:12:32.763 回答