预订和反向预订二叉树遍历

时间:2013-11-09 09:04:59

标签: c++ recursion

我试图以递归方式调用我的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;

}

1 个答案:

答案 0 :(得分: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;
}

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

相关问题