二叉树中结点值的和为输入整数的所有路径-题目描述
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
样例
给出二叉树如下所示,并给出num=22。
5
/ \
4 6
/ / \
12 13 6
/ \ / \
9 1 5 1
输出:[[5,4,12,1],[5,6,6,5]]
二叉树中结点值的和为输入整数的所有路径-总体思路
这里,我在下面的代码中写了很多种写法,我们需要好好体会以下几个点:
(1)我的return条件是什么?(是遇到空节点return还是遇到叶子结点return)
(2)我应该如何处理当前访问到的节点
(2)我应该如何还原现场(是pop一次还是pop两次)
(3)return条件与还原现场的关系是什么?
二叉树中结点值的和为输入整数的所有路径-代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
class Solution { public: vector<vector<int>> res; vector<int> path; void dfs(TreeNode* root, int sum) { if (!root) return; path.push_back(root->val); sum -= root->val; if (!root->left && !root->right && !sum) { res.push_back(path); } dfs(root->left, sum); dfs(root->right, sum); path.pop_back(); } void dfs(TreeNode* root, int sum) { if (!root->left && !root->right) { if (sum == root->val) { path.push_back(root->val); ret.push_back(path); path.pop_back(); } return; }
path.push_back(root->val); if (root->left) dfs(root->left, sum - root->val); if (root->right) dfs(root->right, sum- root->val); path.pop_back(); }
void dfs2(TreeNode* root, int sum) { path.push_back(root->val); sum -= root->val; if (!root->left && !root->right) { if (!sum) { res.push_back(path); } return; } if (root->left) { dfs(root->left, sum); path.pop_back(); }
if (root->right) { dfs(root->right, sum); path.pop_back(); } }
void dfs3(TreeNode* root, int sum) { path.push_back(root->val); sum -= root->val; if (!root->left && !root->right) { if (!sum) { res.push_back(path); } return; } if (root->left) { dfs(root->left, sum); }
if (root->right) { dfs(root->right, sum); }
path.pop_back(); } vector<vector<int>> findPath(TreeNode* root, int sum) { dfs(root, sum); return res; } };
|