NO24、二叉树中和为某一值的路径(好难,哭了,值得再刷)
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> >
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
带你刷完67道剑指offer 文章被收录于专栏
- 本专栏汇集了67道剑指offer的一些精妙解法,不少题有5-6种解法之多,有些题目二刷三刷的解法也不一样。 - 本专栏帮助我拿到6个互联网大厂offer,最终圆梦字节跳动公司。
腾讯公司福利 1155人发布