问题描述:
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
For example:
Given the below binary tree and sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
return
[ [5,4,11,2], [5,8,4,5] ]
原问题链接:https://leetcode.com/problems/path-sum-ii/
问题分析
在这个问题的前一个问题里,其实已经讨论了path sum的判断和推导思路。我们要判断一棵树是否存在有从根到叶节点的路径所有元素的值等于目标元素,需要判断当前节点的值和目标值,然后递归的去推导它的左右子节点和它们的差值之间的比较。这样得到最终的结果。
而这里是要找出所有存在情况下的元素,我们需要遍历所有的情况。在问题的查找上,我们可以同样使用前面的递归情况,只是需要用一个List<List<Integer>>来保存最终的结果。同时也用一个List<Integer>来保存从根节点到某个节点的路径上的值。在每次递归的时候,我们构造一个新的拷贝传入到下一级的递归中。
详细的代码实现如下:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<List<Integer>> pathSum(TreeNode root, int sum) { List<List<Integer>> result = new ArrayList<>(); pathSum(root, sum, result, new ArrayList<Integer>()); return result; } private void pathSum(TreeNode root, int sum, List<List<Integer>> result, List<Integer> list) { if(root == null) return; List<Integer> copy = new ArrayList<>(list); copy.add(root.val); if(root.val == sum && root.left == null && root.right == null) { result.add(copy); return; } pathSum(root.left, sum - root.val, result, copy); pathSum(root.right, sum - root.val, result, copy); } }
相关推荐
java lru leetcode :ice_cream: LeetCode Kindem 的个人 LeetCode 题解仓库,欢迎交流学习。 下面的目录中 $number 题号代表经典 LeetCode 题目,$number.$number ...LeetCode ...Sum ...Sum ...Sum ...Path Sum 73
java java_leetcode题解之Path Sum III.java
java java_leetcode-113-path-sumII
LeetCode — Path Sum III分析及实现方法 题目描述: You are given a binary tree in which each node contains an integer value. Find the number of paths that sum to a given value. The path does not need...
3. "Binary Tree Maximum Path Sum"(二叉树的最大路径和):这是一道困难级别的问题,涉及到深度优先搜索(DFS)和回溯,寻找从根节点到叶子节点的最大路径和。 开源项目“LeetCode-master”很可能包含了这些问题...
- 数组和链表:LeetCode中的基础题目通常涉及数组和链表操作,如“两数之和”(Two Sum)和“反转链表”(Reverse Linked List)。C++的`std::vector`和`std::list`是常用的容器,能方便地实现这些操作。 - 树形...
public int PathSum(TreeNode root, int sum) { _count = 0; _sum = sum; Travel(root, new List()); return _count; } private void Travel(TreeNode current, List<int> ret) { if (current == null) { ...
Path Sum Unique Paths Unique Paths II Longest Palindromic Substring Interleaving String Triangle Distinct Subsequences Decode Ways Palindrome Partitioning II Maximal Rectangle ###Recursion N-Queens N-...
5. 图论与最短路径:"Shortest Path in Binary Matrix"(二进制矩阵中最短路径)涉及Dijkstra算法或BFS(广度优先搜索),寻找最短路径。 三、字符串处理 字符串处理题目也是LeetCode的重要部分,例如"Reverse ...
1. Two Sum:利用哈希表,时间复杂度降为O(n)。 2. Longest Increasing Subsequence:动态规划求最长递增子序列。 3. Maximum Subarray:Kadane's Algorithm解决最大子数组和问题。 4. Ternary Search:在有序...
对于更复杂的题目,如"Binary Tree Maximum Path Sum"(二叉树的最大路径和),我们需要掌握深度优先搜索(DFS)或广度优先搜索(BFS)策略,同时理解和运用树的性质。在这个问题中,我们需要沿着一条路径递归地访问...
例如“最短路径问题”(Shortest Path in Binary Matrix),可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。 7. **回溯**:一种试错的搜索策略,用于解决约束满足问题。例如“组合总和”(Combination ...
在每个分类下,选择几个代表性的题目进行尝试,例如在“Arrays”分类下,可以先解决“Two Sum”这样的基础题目,以理解数组操作的基本思路。 接下来,是“Medium”级别的挑战。这个阶段的题目难度有所提升,往往...
5. **二叉树**:二叉树问题包括遍历、查找、平衡调整等,如"二叉树的最大路径和"(Maximum Path Sum)、"验证二叉搜索树"(Validate Binary Search Tree)。 6. **回溯**:回溯是一种尝试所有可能解的算法策略,...
例如,"两数之和"(Two Sum)问题,可以通过哈希表在O(n)时间内找到目标和对应的两个数。 2. **字符串**:字符串处理题目通常涉及模式匹配、字符统计和字符串转换。如"无重复字符的最长子串"(Longest Substring ...
例如,"二叉树的最大路径和"(Maximum Path Sum)要求找到从根节点到叶子节点的路径,使得经过的节点权值之和最大。 5. **动态规划**:动态规划是一种解决问题的方法,通过将问题分解成更小的子问题来求解。如"背包...
leetcode 【演示记录】 报告 展示 2017/03/06 1.二和,167.二和二 2107/03/06 15.3 总和,16.3 总和最近,18.4 总和,11.最多水的容器 2017/03/09 62.Unique Paths, 63.Unique Paths II, 64.Minimum Path Sum 2017/...
Path to Get All Keys 深度优先搜索 996. Number of Squareful Arrays 拓扑排序 269. Alien Dictionary 单调栈 42. Trapping Rain Water 85. Maximal Rectangle Monotonic stack for 2d array 239. Sliding Window ...
python python_leetcode题解之113_Path_Sum_II
java java_leetcode-112-path-sum