算法提高之LeetCode刷题数据结构和算法分析

LeetCode算法题-Path Sum(Java实现)

2018-11-12  本文已影响0人  程序员小川

这是悦乐书的第169次更新,第171篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第28题(顺位题号是112)。给定二叉树和整数sum,确定树是否具有根到叶路径,使得沿路径的所有值相加等于给定的sum。叶子节点是没有子节点的节点。例如:

给定以下二叉树和sum = 22,

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

返回true,因为存在根到叶的路径5-> 4-> 11-> 2,并且和为22。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况一:当二叉树为空时,直接返回false。

特殊情况二:当二叉树只有一个节点时,即此节点为根节点,并且节点值等于sum,返回true。

正常情况:对于此题,遍历二叉树的节点时,需要使用深度优先的算法,我们可以借助递归,并且上面两种特殊情况也是递归的终止条件。对于从根节点进来的左右子树,可以同时进行递归,每次对相应的节点做减法,直到满足上面的特殊情况二为止。

public boolean hasPathSum(TreeNode root, int sum) {
    if(root == null ){
        return false;
    }
    if (root.left == null && root.right == null && (sum - root.val) == 0) {
        return true;
    }
    return hasPathSum(root.left, sum-root.left.val) || hasPathSum(root.right, sum-root.right.val);
}

03 第二种解法

除了上面的递归,我们是否可以用迭代的方法呢?答案是可以的。

因为还是需要满足深度优先,所以我们单独使用了一个队列来放每条路径上的各节点之和,在每次取出一个节点的时候,同时取出一个和来,判断此节点是否为叶子节点并且判断和是否等于sum。

public boolean hasPathSum2(TreeNode root, int sum) {
    if(root == null ){
        return false;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    Queue<Integer> sums = new LinkedList<>();
    queue.offer(root);
    sums.offer(root.val);
    while(!queue.isEmpty()) {
        TreeNode t = queue.poll();
        int temSum = sums.poll();
        if (t.left == null && t.right == null && temSum == sum) {
            return true;
        }
        if (t.left != null) {
            queue.offer(t.left);
            sums.offer(temSum + t.left.val);
        }
        if (t.right != null) {
            queue.offer(t.right);
            sums.offer(temSum + t.right.val);
        }
    }
    return false;
}

04 小结

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

上一篇 下一篇

猜你喜欢

热点阅读