您的位置:首页 > 其它

LeetCode 112. Path Sum

2016-02-18 00:01 471 查看
是否存在根到叶节点的和等于给定数。

思路:递归。判断左儿子或右儿子是否存在这一路径(sum变为sum-root->val)。

ver0:递归到最后会是叶节点的左右儿子,所以要有root==NULL的判断

class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL){//ERROR
if(sum == 0) return true;
else return false;
}
// if(sum < root->val) return false;
return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
}
};


WA:

Input:[] 0
Output:true
Expected:false

ver1:原始树是否为空另外判断。

class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL) return false;
return help(root,sum);

}

bool help(TreeNode* root, int sum){
if(root==NULL){
if(sum == 0) return true;
else return false;
}
// if(sum < root->val) return false;
return help(root->left,sum-root->val) || help(root->right,sum-root->val);//ERROR
}
};


WA:

Input:[1,2] 1
Output:true
Expected:false
将只有一个儿子的节点误当作叶节点。

ver2:

class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL) return false;
return help(root,sum);

}

bool help(TreeNode* root, int sum){
if(root==NULL){
if(sum == 0) return true;
else return false;
}
// if(sum < root->val) return false;

if(root->left && root->right) return help(root->left,sum-root->val) || help(root->right,sum-root->val);
if(root->left) return help(root->left,sum-root->val);
if(root->right) return help(root->right,sum-root->val);

      //leaf-node:
if(sum == 0) return true;//ERROR
return false;

}
};


WA:

Input:[1] 1
Output:false
Expected:true
叶节点的情况下判断错误(即sum==0),应为sum==root->val。

ver3:

class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL) return false;
return help(root,sum);

}

bool help(TreeNode* root, int sum){
// if(root==NULL){
//     if(sum == 0) return true;
//     else return false;
// }
// if(sum < root->val) return false;

if(root->left && root->right) return help(root->left,sum-root->val) || help(root->right,sum-root->val);
if(root->left) return help(root->left,sum-root->val);
if(root->right) return help(root->right,sum-root->val);
if(sum == root->val) return true;
return false;

}
};


别人的简洁版代码:

class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL)
return false;
if(root->val == sum && root->left == NULL && root->right == NULL)
return true;
return hasPathSum(root->left, sum-root->val) || hasPathSum(root->right, sum-root->val);
}
};


递归到最后传入的是叶节点而非其左右儿子,所以不必另开help函数。

如果是只有一个儿子的节点,也可处理(落入root==NULL的判断内)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: