小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
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)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。