24、二叉树中和为某一值的路径 好难,哭了,值得再刷
题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
示例1
输入
{10,5,12,4,7},22
返回值
[[10,5,7],[10,12]]
示例2
输入
{10,5,12,4,7},15
返回值
[]
1、带有回溯性质的解法
void FindPathCore(vector<vector<int>>&result, vector<int> &temp, TreeNode* root, int sum) { if (root == nullptr) return; temp.push_back(root->val); if (root->left == nullptr && root->right== nullptr && sum == root->val) { result.push_back(temp); } else { if (root->left) { FindPathCore(result, temp, root->left, sum-root->val); } if (root->right) { FindPathCore(result, temp, root->right, sum - root->val); } } temp.pop_back();//走到这里了,说明当前节点不满足要求,pop掉,返回其父亲节点 } vector<vector<int> > FindPath(TreeNode* root, int expectNumber) { vector<vector<int>> result; vector<int> temp; FindPathCore(result, temp, root, expectNumber); return result; }
但这题是要求按照字典序返回结果的,所以最后应该是将result进行排序,优先返回那些长度较长的路径。所以最后应该再判断一下,可以用lambda表达式或者重载一个 () 也可以
void FindPathCore(vector<vector<int>>&result, vector<int> temp, TreeNode* root, int sum) { if (root == nullptr) return; temp.push_back(root->val); if (root->left == nullptr && root->right== nullptr && sum == root->val) { result.push_back(temp); } else { if (root->left) { FindPathCore(result, temp, root->left, sum-root->val); } if (root->right) { FindPathCore(result, temp, root->right, sum - root->val); } } temp.pop_back();//走到这里了,说明当前节点不满足要求,pop掉,返回其父亲节点 } vector<vector<int> > FindPath(TreeNode* root, int expectNumber) { vector<vector<int>> result; vector<int> temp; FindPathCore(result, temp, root, expectNumber); sort(result.begin(),result.end(),[&](ve