Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
Note: A leaf is a node with no children.
Example:
Given the below binary tree and sum = 22,
1234567 |
5 / 4 8 / / 11 13 4 / 7 2 1 |
return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.
看到这道题,嗯~
其实我锁定的本题的字眼在 “root-to-leaf”,这就是说明,至少你要从根节点一直遍历到叶节点为止。讲所有的叶节点遍历完之后,也就得到了多少个答案,然后从答案中筛选出预期的结果。
遍历的图比较好的方式一般使用递归的方式,因为迭代会使程序写法变得复杂~
12345678910111213141516171819202122232425262728293031323334353637383940414243 |
* Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class {public: void calcuSum(struct TreeNode* root, int sum) { if (nullptr != root) { if(nullptr!=root->left&&root->right==nullptr) calcuSum(root->left, sum + root->val); if(nullptr != root->right&&root->left==nullptr) calcuSum(root-&g 大专栏 求二叉树的路径和(path sum)t;right, sum + root->val); if (nullptr != root->left&&nullptr != root->right) { calcuSum(root->left, sum + root->val); calcuSum(root->right, sum + root->val); } if (nullptr == root->left&&nullptr == root->right) { //or calcuSum(root->right, sum + root->val); calcuSum(root->left, sum + root->val); } } else { result.insert(sum); } } bool hasPathSum(TreeNode* root, int sum) { if(nullptr==root){ return false; } calcuSum(root,0); if(result.find(sum)!=result.end()){ return true; }else{ return false; } }private: set<int> result;}; |
根据鄙人的解题思路~ 写出上了以上代码~
上诉考虑到了容器的选择,我使用了set容器,主要是考虑从查找效率上。其实容器也可以选择vector,这个影响不是很大。
有了上诉题目的引子~
根据查找的结果,显示出路径来,题目如下:
Given a binary tree and a sum, find all root-to-leaf paths where each path’s sum equals the given sum.
Note: A leaf is a node with no children.
Example:
Given the below binary tree and sum = 22,
12345678910111213 |
5 / 4 8 / / 11 13 4 / / 7 2 5 1Return: [ [5,4,11,2], [5,8,4,5]] |
这道题和上一题一样的,不同的是,我们需要记录路径了,路径怎么记录~
这时候,我们可以使用容器vector<>,然后利用形参的copy作用,讲所有root-to-leaf路径存储起来,我们只需要将上面例子的int num,换成vector就行了,然后将这个值存储起来即可~~~
原文地址:https://www.cnblogs.com/lijianming180/p/12401954.html