【问题标题】:Preorder and Reverse Preorder Binary Tree Traversals前序和逆序二叉树遍历
【发布时间】:2013-11-09 17:12:32
【问题描述】:

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

}

【问题讨论】:

    标签: c++ recursion


    【解决方案1】:

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

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

    【讨论】:

    • 如果这回答了您的问题,请务必投票并将其标记为答案。谢谢!
    猜你喜欢
    • 2021-03-08
    • 2023-01-09
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多