《从头再来》剑指offer.34 二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
这是一个典型的dfs的题目,也就是说我们以一条路走到黑来判断。每遇到一个节点,就判断将该节点加入后和target的差距还有多少。
递归返回的条件为节点为空。当然,如果走到根结点,并且加上该根结点的值就等于target,那么就将路径加入结果中,并且返回。无论在什么时候返回,返回前一定要将前一个节点弹出队列。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: void dfs(TreeNode* root, int target, vector<int>& path){ if(root == nullptr) return; target -= root->val; path.push_back(root->val); if(target == 0 && root->left == nullptr && root->right == nullptr){ result.push_back(path); path.pop_back();//pop的时候,一定是没有值的!!! return; } dfs(root->left,target,path); dfs(root->right,target,path); path.pop_back();//到底在返回前为什么要弹出呢??? //因为该节点的值加上后和target不相等(还使用了当前节点的子节点),所以需要pop后,再找另一个值 return; } vector<vector<int>> result; vector<vector<int>> pathSum(TreeNode* root, int target) { vector<int> path; dfs(root,target,path); return result; } };
《从头再来》

浙公网安备 33010602011771号