关于弹出向量元素

时间:2017-03-14 23:53:28

标签: c++ binary-tree

以下代码用于查找所有与特定sum相等的根到叶路径,给定二叉树和sum

class Solution {
public:
    void buildResult(std::vector< std::vector< int > >& result, std::vector< int >& ans, TreeNode* root, int sum) {
        if(!root)
            return;

        ans.push_back(root->val);
        if(root->val==sum && !root->left && !root->right)
            result.push_back(ans);
        buildResult(result, ans, root->left, sum-(root->val));
        buildResult(result, ans, root->right, sum-(root->val));
        ans.pop_back();
    }

    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        std::vector< vector< int > > result;
        std::vector< int > ans;

        if(!root)
            return result;

        buildResult(result, ans, root, sum);
        return result;
    }
};

上面的代码可以工作并生成预期的输出。但是,我不理解语句ans.pop_back();的使用 - 我理解它是为了回溯,但是这个回溯到底是什么时候进行的呢?即使在检查它们是否位于有效路径之前,这些值也会插入到向量ans中。此外,pop_back()的数量应该很多,具体取决于插入了多少导致错误总和的数字。有人可以向我解释一下吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

回溯是通过返回递归函数来实现的。

递归函数通过将当前节点推入ans来记录其遍历树的路径。当它到达叶子时,它会检查叶子的值,如果匹配,则将ans推入result,记录它刚构建的路径。

您可以将ans视为当前节点的面包屑路径。每次递归函数进入树中的节点时,它都会将当前节点的值推送到ans,当到达右叶时,面包屑的尾部是叶节点的路径。

因此,递归函数通过返回离开它正在访问的当前节点。通过从递归调用返回,递归函数返回其父级。但是,在从当前的面包屑尾部移除最后一个面包屑之前,还没有恢复面包屑的痕迹,只包含其父节点的路径,这正是它返回的位置。