以下代码用于查找所有与特定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()
的数量应该很多,具体取决于插入了多少导致错误总和的数字。有人可以向我解释一下吗?
谢谢!
答案 0 :(得分:0)
回溯是通过返回递归函数来实现的。
递归函数通过将当前节点推入ans
来记录其遍历树的路径。当它到达叶子时,它会检查叶子的值,如果匹配,则将ans
推入result
,记录它刚构建的路径。
您可以将ans
视为当前节点的面包屑路径。每次递归函数进入树中的节点时,它都会将当前节点的值推送到ans
,当到达右叶时,面包屑的尾部是叶节点的路径。
因此,递归函数通过返回离开它正在访问的当前节点。通过从递归调用返回,递归函数返回其父级。但是,在从当前的面包屑尾部移除最后一个面包屑之前,还没有恢复面包屑的痕迹,只包含其父节点的路径,这正是它返回的位置。