文章目录
1.题目
- 题目要求
- eg:
Example:
Given the below binary tree and sum = 22,
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.
- 递归写法要求:
(1)递归终止条件:用深度优先算法 DFS 的思想来遍历每一条完整的路径。即利用递归不停找子结点的左右子结点;
首先,如果输入的是一个空结点,则直接返回 false;
如果如果输入的只有一个根结点,则比较当前根结点的值和参数 sum 值是否相同,若相同,返回 true,否则 false
(2)由于函数的返回值是 Ture/False,可以同时两个方向一起递归,中间用或 || 连接,
只要有一个是 True,整个结果就是 True。
递归左右结点时,这时候的 sum 值应该是原 sum 值减去当前结点的值 - 迭代法:使用前序遍历
先序遍历二叉树,左右子结点都需要加上其父结点值,这样当遍历到叶结点时,如果和 sum 相等了,那么就说明一定有一条从 root 过来的路径
2.代码
递归法
class Solution{
public:
bool hasPathSum(TreeNode* root, int sum)
{
if (!root) return false;
if (!root->left && !root->right && root->val == sum ) return true;
return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
}
};
迭代法:前序遍历
class Solution{
public:
bool hasPathSum(TreeNode* root, int sum)
{
stack<TreeNode*> stak;
stak.push(root);
while (!stak.empty())
{
TreeNode* node=stak.top();stak.pop();
if (!node->left && !node->right && node->val == sum) return true;
if (node->right)
{
node->right->val+=node->val;
stak.push(node->right);
}
if (node->left)
{
node->right->left+=node->val;
stak.push(node->left);
}
}
return false;
}
};