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


    这是悦乐书的第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 小结

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

  • 相关阅读:
    SQLServer 2008 还原数据库备份版本不兼容的问题
    全排列函数
    n & 1
    最长公共子序列(LCS)最长递增子序列(LIS)
    unity3DGI
    多继承的缺点
    JSON文件导入Unity3d中是空的的问题
    丑数
    整数中1出现的次数
    检测鼠标是否在UI上unity
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/9944958.html
Copyright © 2020-2023  润新知