LEETCODE112.路径总和

题目:路径总和
 

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

LEETCODE112.路径总和_第1张图片

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

LEETCODE112.路径总和_第2张图片

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示:

  • 树中节点的数目在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000
  • 法一:广度优先搜索
    两个队列
    que_node存储树上的每一个结点
    que_val存储路径的和
     
  • /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    class Solution 
    {
    public:
        bool hasPathSum(TreeNode *root, int sum) 
        {
            if (root == nullptr) 
            {
                return false;
            }
            queue que_node;//存储树上的每一个结点
            queue que_val;//存储路径和
            que_node.push(root);//将根结点入队
            que_val.push(root->val);//将根结点对应的值入队
            while (!que_node.empty()) 
            {
                TreeNode *now = que_node.front();//now指针指向的是当前树的结点
                int temp = que_val.front();//temp存储路径和
                que_node.pop();//将当前结点出队
                que_val.pop();//出队
                if (now->left == nullptr && now->right == nullptr) //如果该节点是叶子节点,也就是没有左右分支
                {
                    if (temp == sum) //判断从根结点到此叶子结点的路径和是不是所求,找到了就返回true
                    {
                        return true;
                    }
                    continue;//每找到就重新开始下一个循环
                }
                if (now->left != nullptr) //进入左分支
                {
                    que_node.push(now->left);
                    que_val.push(now->left->val + temp);
                }
                if (now->right != nullptr) //进入右分支
                {
                    que_node.push(now->right);
                    que_val.push(now->right->val + temp);
                }
            }
            return false;
        }
    };
     

你可能感兴趣的:(蓝桥杯备赛,算法,c++,广度优先)