其他分享
首页 > 其他分享> > LeetCode——路径总和

LeetCode——路径总和

作者:互联网

LeetCode——路径总和

题目描述:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \      \
    7    2      1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:
我们用深度优先的方法解决这个问题。该函数的目标是找到一条从根节点到叶子节点的路径,使得这条路径总和等于sum。我们可以把这个问题看成是:假定根节点到当前节点的路径长度为val,判断当前节点的下一个节点到叶子节点的总和是否等于sum - val。可以看成是遍历每个节点的时候让sum减去该节点的val值。可以发现这满足递归的条件,我们在函数中判断当前节点是否为叶子节点,如果是叶子节点则判断是否满足sum等于该节点的val值,并将节点返回。如果不是叶子节点则继续向下递归。

解法二:
我们用广度优先的方法来解决这个问题,大概的思想就是,我们定义两个队列,一个用来存储树的节点(广度优先遍历),一个用来存储每个节点对应的到根节点的总长度。我们在遍历的过程中判断该节点是否是叶子节点,如果是叶子节点则看它对应的长度是否等于val,是则返回True,不是则继续遍历。当然,我们如果用Python做这个方法还可以用字典,将节点作为键,将其到根节点的长度作为值。

这里提供两种解法的Java和Python代码。

解法一Java代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null){
            return false;
        }
        if (root.left == null && root.right == null){
            return sum == root.val;
        }
        return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
    }
}

LeetCode测试结果:
在这里插入图片描述

解法二Java代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null){
            return false;
        }
        Queue<TreeNode> Node = new LinkedList<TreeNode>();
        Queue<Integer> Value = new LinkedList<Integer>();
        Node.offer(root);
        Value.offer(root.val);
        while (!Node.isEmpty()){
            TreeNode nowNode = Node.poll();
            int nowValue = Value.poll();
            if (nowNode.left == null && nowNode.right == null){
                if (nowValue == sum){
                    return true;
                }
                continue;
            }
            if (nowNode.left != null){
                Node.offer(nowNode.left);
                Value.offer(nowValue + nowNode.left.val);
            }
            if (nowNode.right != null){
                Node.offer(nowNode.right);
                Value.offer(nowValue + nowNode.right.val);
            }
        }
        return false;
    }
}

LeetCode测试结果:
在这里插入图片描述

解法一Python代码:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if root is None:
            return False
        if root.left is None and root.right is None:
            return sum == root.val
        return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val)

LeetCode测试结果:
在这里插入图片描述

解法二Python代码:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if root is None:
            return False
        Node = [root]
        Value = [root.val]
        while Node:
            nowNode = Node[0]
            nowValue = Value[0]
            del Node[0]
            del Value[0]
            if nowNode.left is None and nowNode.right is None:
                if nowValue == sum:
                    return True
                continue
            if nowNode.left is not None:
                Node.append(nowNode.left)
                Value.append(nowNode.left.val + nowValue)
            if nowNode.right is not None:
                Node.append(nowNode.right)
                Value.append(nowNode.right.val + nowValue)
        return False

LeetCode测试结果:
在这里插入图片描述

标签:right,val,sum,路径,LeetCode,nowNode,root,节点,总和
来源: https://blog.csdn.net/weixin_45295612/article/details/110069323