剑指offer:82-题解 | #二叉树中和为某一值的路径(一)#
二叉树中和为某一值的路径(一)
http://www.nowcoder.com/practice/508378c0823c423baa723ce448cbfd0c
题目描述:
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
例如:
给出如下的二叉树, sum=22
返回true,因为存在一条路径25→4→11→2的节点值之和为 22
数据范围:
1.树上的节点数满足 100000≤n≤10000
2.每 个节点的值都满足1000∣val∣≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
进阶:空间复杂度 O(树的高度),时间复杂度 O(n)
注意:题目要求的是某一条路径,是完整路径上,节点之和为sum
题解1:DFS + 递归
代码
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @param sum int整型
* @return bool布尔型
*/
bool hasPathSum(TreeNode* root, int sum) {
// write code here
//递归出口
if(!root) return false;
sum-=root->val;//每一次递归
if(!root->left && !root->right && sum ==0 )
return true;
return hasPathSum(root->left, sum) || hasPathSum(root->right, sum);
}
};
题解2:层次遍历
题解3:DFS+递归
代码
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @param sum int整型
* @return bool布尔型
*/
bool dfs(TreeNode * root, int sum){
if(!root) return false;
sum-=root->val;
if(!root->left && !root->right && sum==0)
return true;
return dfs(root->left,sum) || dfs(root->right, sum);
}
bool hasPathSum(TreeNode* root, int sum) {
// write code here
//递归出口
if(!root) return false;
return dfs(root, sum);
}
};