leetcode刷题-112路径总和

72 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

leetcode112-路径总和

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

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

示例 1: 输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true

示例 2: 输入:root = [1,2,3], targetSum = 5 输出:false

示例 3: 输入:root = [1,2], targetSum = 0 输出:false

解题思路分析

解法1:

本解法的思路是对二叉树进行遍历,按照节点顺序进行。利用栈的数据结构,从根节点触发,每次遍历都将当前节点出栈,同时将两个子节点入栈。同时,利用map对遍历到的每个节点当前的路径总和进行存储,以此减少重复的计算操作。经过对所有节点的遍历,即可得到题目所需的是否存在对应路径的结果。

public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root == null){
            return false;
        }
        Stack<TreeNode> stack = new Stack<>();
        HashMap<TreeNode,Integer> stashvalue = new HashMap<>();
        int sum = 0;
        stack.push(root);
        while (stack.size() > 0) {
//            节点出栈,左右节点入栈
            if(stack.peek() != null){
                TreeNode item = stack.pop();
                sum = stashvalue.get(item) != null ? stashvalue.get(item) : 0;
                sum += item.val;
                if(item.right != null){
                    stack.push(item.right);
                    stashvalue.put(item.right,sum);
                }

                if(item.left != null){
                    stack.push(item.left);
                    stashvalue.put(item.left,sum);
                }

                if(item.left == null && item.right == null && sum == targetSum){
                    return true;
                }
            }else{
                if(sum == targetSum){
                    return true;
                }else{
                    sum = root.val;
                    continue;
                }
            }
        }
        return false;
    }

复杂度分析

  • 时间复杂度:o(n)
  • 空间复杂度:o(n)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。