首页 > 试题广场 >

给出一个二叉树,用一个函数确定是否有一条从根节点到叶子节点的

[问答题]
给出一个二叉树,用一个函数确定是否有一条从根节点到叶子节点的路径,这个路径上所有节点的值加在一起等于给定的sum的值。函数声明hasPathSum已经给出,写出程序设计思路并且实现该函数。尽量提供多种实现方法。
/**
* 二叉树节点定义如下:
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
bool hasPathSum(TreeNode *root, int sum) {
}

示例:
给定的二叉树和 sum = 22,
5
/ \
4   8
/   / \
11  13  4
/  \      \
7    2      1

返回值是ture, 即存在一条 root-to-leaf 的路径 5->4->11->2 节点值相加等于22
bool hasPathSum(TreeNode *root, intsum) {
 
    if(root == NULL)
 
        return false;
 
    if(root->val == sum)
 
        return true;
 
    return (hasPathSum(root->left, sum-root->val) ||
 
            hasPathSum(root->right, sum-root->val));
 
}

发表于 2017-09-18 22:34:13 回复(4)

python解法如下:

def hasPathSum(root, sum):
    if not root:
        return False
    sum -= root.val
    if sum == 0 and root.left is None and root.right is None:
        return True
    return hasPathSum(root.left, sum) or hasPathSum(root.right, sum)
编辑于 2017-09-10 10:28:43 回复(2)
//这或许是最短的代码了吧?
bool hasPathSum(TreeNode* root, int sum) {
    if (nullptr == root) return sum == 0;
    return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
}

发表于 2018-05-14 22:57:47 回复(0)
bool hasPathSum(TreeNode *root, int sum) {
    if (root->left == NULL && root->right == NULL) {                //叶子节点,直接判断
        return root->val == sum;
    } else if(root->left != NULL && root->right == NULL) {        //左边有树,右边没树,左树递归
        return hasPathSum(root->left, sum - root->val);
    } else if(root->left == NULL && root->right != NULL) {        //右边有树,左边没树,右树递归
        return hasPathSum(root->right, sum - root->val);
    } else {                                                                                // 两边都有树,左边递归,右边也递归,取或
        return hasPathSum(root->left, sum - root->val) | hasPathSum(root-right, sum - root->val);
    }
}
发表于 2017-09-07 14:16:14 回复(0)
//稍微修改了下flxyq的答案,另外也没必要像高票答案那么繁琐
bool hasPathSum(TreeNode *root, int sum) {        
         if(nullptr == root || sum < 0)        
             return false;
    
         if(root->left == nullptr && root->right == nullptr && sum-root->val==0)        
             return true;  
    
         return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->right);        
         } 

发表于 2019-08-08 15:39:46 回复(0)
bool hasPathSum(TreeNode *root, intsum) {
    if( root == NULL && sum != 0 ) return false; // 二叉树的值有正有负吗?
    if(sum == 0) return true;
    else return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
}
没有在线判题,不知道对不对。请大神们斧正
编辑于 2017-11-01 20:39:46 回复(0)
bool has(Tree *root, int sum)
{
int counter = sum - root->val;
if (counter == 0)
return true;
if (root->left != NULL&&root->right!=NULL){
return has(root->left, counter)||has(root->right,counter);
}
else if (root->right != NULL&&root->left==NULL)
{
return has(root->right, counter);
}
else if (root->left != NULL&&root->right == NULL)
{
return has(root->left, counter);
}
return false;
}

编辑于 2017-09-07 20:39:03 回复(0)
bool hasPathSum(TreeNode *root, int sum) {
    TreeNode *p=root;
    if(p->left==NULL&&p-right==NULL)    
    {
        if(p->val==sum)
            return true;
        else
            return false;
    }
    if((p->left!=NULL)&&hasPathSum(p->left,sum-p->val))
        return true;
    else if((p->right!=NULL)&&hasPathSum(p->right,sum-p->val))
        return true;
    else
        return false;
    
}

发表于 2017-09-05 19:19:04 回复(0)
bool hasPathSum(TreeNode *root, int sum) {
if(root==NULL)
return null;
if(root->left==NULL&&root->right==NULL&&sum-root->val==0)
return true;
return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->right);
}

编辑于 2017-09-08 18:51:43 回复(3)
//剑指offer原题
//注意是根结点到叶子结点,不要把情况想复杂了。
bool hasPathSum(TreeNode *root,int sum)
{ 
   vector<int> vec;            //表示单条路径
   vector<vector<int> > trace;   //所有满足条件的路径和的集合
   int currentSum=0;      //路径和,初始为0
   hasPathCore(root,vec,trace,currentSum,sum);
   if(trace.empty())   //如果trace为空,说明没有满足条件的路径
       return false;
   else
       return true;
}
 
void hasPathCore(TreeNode *root,vector<int> &vec,vector<vector<int> > &trace,int currentSum,int sum)
{
   if(root==NULL)
        return;
   currentSum+=root->val;
   vec.push_back(root->val);
   bool flag=((root->left==NULL)&&(root->right==NULL));
   if(currentSum==sum&&flag)
        trace.push_back(vec);
   if(root->left!=NULL)
        hasPathCore(root->left,vec,trace,currentSum,sum);  
   if(root->right!=NULL)
        hasPathCore(root->right,vec,trace,currentSum,sum);
   vec.pop_back();
 }

编辑于 2017-09-05 17:02:17 回复(0)
bool hasPathSum(TreeNode *root, int sum) {
if(root->val==sum) return true;
if(root->left!=NULL) {
hasPathSum(root->left,sum-root->val);
}
if(root->right!=NULL){
hasPathSum(root->right,sum-root->val);
}
return false;
}

发表于 2022-04-22 18:02:38 回复(0)
class Solution {
public:
    vector<vector<int>> res;
    
    vector<vector<int>> pathSum(TreeNode* root, int sum) 
    {
        if(!root)
            return {};
        
        vector<int> path;
        pathSumCore(root, sum, path, 0);
        
        return res;
    }
    
    void pathSumCore(TreeNode* root, int sum, vector<int>& path, int cur)
    {
        if(!root)
            return;
        
        cur += root->val;
        path.push_back(root->val);
        
        if(root->left == NULL && root->right == NULL && sum == cur)
            res.push_back(path);
                
        if(root->left != NULL)
            pathSumCore(root->left, sum, path, cur);
        
        if(root->right != NULL)
            pathSumCore(root->right, sum, path, cur);
        
        path.pop_back();
        cur -= root->val;
    }
};


发表于 2020-05-06 10:20:39 回复(0)
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);
    }

发表于 2019-07-27 14:30:23 回复(0)
def hasPathSum(root, int sum):
    if not root or root.val>sum:
        return False
    if root.val==sum:
        return True
    return hasPathSum(root.left,sum-root.val) and hasPathSum(root.right,sum-root.val) 

发表于 2019-04-17 15:55:14 回复(0)
boolhasPathSum(TreeNode *root, intsum) {
    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));

}

发表于 2019-03-30 15:30:44 回复(0)
= = 树形DP(DFS) +  剪枝吧。 O(N)的复杂度
发表于 2018-11-29 09:26:59 回复(0)
class Solution {
private:
    vector<vector<int> > result;
    void findnode(TreeNode *root, const int expectNumber,int sum,vector<int> &path)
    {
        if (root == NULL)

        {
            return;
        }

            path.push_back(root->val);
            sum += root->val;

            if (!root->left && !root->right && sum == expectNumber)
            {
                result.push_back(path);
            }
            else {
                findnode(root->left,expectNumber,sum,path);
                findnode(root->right,expectNumber,sum,path);
            }
            path.pop_back();
            sum -= root->val;
    }
public:
    vector<vector<int> > FindPath(TreeNode* root, int expectNumber)
    {
        vector<int> path;
        findnode(root,expectNumber,0,path);
        return result;
    }
};
发表于 2017-12-20 11:20:25 回复(0)
boolHasPath (node *root, int sum) { if root_val ==sum if root_val<sum root_left = root_val+left_val root-right-val =root_val +left_val boolhaspath(node *left) boolhaspath(node *right) }
发表于 2017-12-02 09:46:56 回复(0)
我觉得就是一个二叉树的 遍历,没啥别的,再一个就是你在遍历的时候顺带将每一个节点的值加起来。
发表于 2017-10-27 20:01:47 回复(0)
bool hasPathSum(TreeNode *root, int num){
    
    int flag = 0;
    void DFS(TreeNode *root, int num)
    {

        if(root->left == NULL && root->right == NULL)
        {
            if(tmp == num) 
            {
                flag = 1;
            }
            return;
        }
        else
        {
            DFS(root->left, tmp + root.val);
            DFS(root->right, tmp + root.val);
        }
    }
    if(flag == 0) return false;
    else return true;

}

发表于 2017-10-03 14:50:28 回复(0)