【问题】输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
【思路】如果我们用语言表述的话,从头节点开始,走向叶节点,每条路都走一遍,然后判断每个路径的和是不是expectNumber,这就是DFS的思想。由于我们需要记录住每条路径,因此我们必须在每次递归后将trace的状态恢复为原来的状态,这样才可以达到共享trace空间的作用!
递归结束后将trace空间恢复到原来状态,这一操作也叫做回溯法!!!
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: void dfs(vector<vector<int>> &res, TreeNode* root, int number, vector<int>& trace){ trace.push_back(root->val); // 记录当前节点的值 if(root->left == nullptr && root->right == nullptr){ if(number == root->val){ // 叶节点且路径之和为expectNumber,结束递归 res.push_back(trace); } }else{ if(root->left){ dfs(res, root->left, number-root->val, trace); } if(root->right){ dfs(res, root->right, number-root->val, trace); } } trace.pop_back(); } vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { vector<vector<int>> res; vector<int> trace; if(root != nullptr){ dfs(res, root, expectNumber, trace); return res; } return res; } };
原文:https://www.cnblogs.com/zhudingtop/p/11337946.html