一、题目描述
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
二、思路
方法一:DFS递归
最直接的方法就是利用递归,遍历整棵树:如果当前节点不是叶子,对它的所有孩子节点,递归调用 hasPathSum 函数,其中 sum 值减去当前节点的权值;如果当前节点是叶子,检查 sum 值是否为 0,也就是是否找到了给定的目标和。
方法二:DFS迭代
其实和递归的思路一样,只不过递归是系统维护空间,而这里是自己维护栈空间。需要自定义一个栈,保存当前结点以及当前的sum。我们可以用栈将递归转成迭代的形式。深度优先搜索在除了最坏情况下都比广度优先搜索更快。
本题采用的是先序遍历的方法,进行迭代
三、实现
DFS递归:
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root == NULL) return false;
sum -= root->val;
if((root->left == NULL) && (root->right == NULL)) return (sum == 0);
return hasPathSum(root->left,sum) || hasPathSum(root->right,sum);
}
};
DFS迭代:
//利用先序遍历进行DFS的迭代
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root == NULL) return false;
stack<pair<TreeNode*,int>> s;
s.push(make_pair(root,sum));
TreeNode* node = root;
int currSum;
while(!s.empty()){
node = s.top().first;
currSum = s.top().second;
s.pop();
if(node->left == NULL && node->right == NULL && node->val == currSum)
return true;
if(node->right) s.push(make_pair(node->right,currSum - node->val));
if(node->left) s.push(make_pair(node->left,currSum - node->val));
}
return false;
}
};
版权声明:本文为qq_34201858原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。