Leetcode 113 路徑總和 II
阿新 • • 發佈:2021-01-20
題目定義:
給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。
說明:葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
方式一(回溯):
class Solution { private List<List<Integer>> ans = new ArrayList<>(); public List<List<Integer>> pathSum(TreeNode root, int sum) { if(root == null) return ans; dfs(new ArrayList<>(),root,sum); return ans; } private void dfs(List<Integer> list,TreeNode root,int remaining){ if(root == null) return; list.add(root.val); if(root.left == null && root.right == null && remaining - root.val == 0){ List<Integer> dest = new ArrayList<>(); Collections.addAll(dest, new Integer[list.size()]); Collections.copy(dest,list); ans.add(dest); return; } dfs(list,root.left,remaining - root.val); dfs(list,root.right,remaining - root.val); list.remove(list.size() - 1); } }
方式二(深度優先遍歷):
class Solution { List<List<Integer>> ans = new LinkedList<>(); Deque<Integer> stack = new LinkedList<>(); public List<List<Integer>> pathSum(TreeNode root, int targetSum) { dfs(root,targetSum); return ans; } private void dfs(TreeNode root,int targetSum){ if(root == null) return; stack.offerLast(root.val); targetSum -= root.val; if(root.left == null && root.right == null && targetSum == 0){ ans.add(new LinkedList<>(stack)); } dfs(root.left,targetSum); dfs(root.right,targetSum); stack.pollLast(); } }
方式三(廣度優先遍歷):
class Solution { List<List<Integer>> ans = new ArrayList<>(); Map<TreeNode,TreeNode> cache = new HashMap<>(); public List<List<Integer>> pathSum(TreeNode root, int targetSum) { if(root == null) return ans; Queue<TreeNode> queueNode = new ArrayDeque<>(); Queue<Integer> queueParentSum = new ArrayDeque<>(); queueNode.offer(root); queueParentSum.offer(0); while(!queueNode.isEmpty()){ TreeNode node = queueNode.poll(); int ret = node.val + queueParentSum.poll(); if(node.left == null && node.right == null){ if(ret == targetSum){ getPath(node); } }else{ if(node.left != null){ cache.put(node.left,node); queueNode.offer(node.left); queueParentSum.offer(ret); } if(node.right != null){ cache.put(node.right,node); queueNode.offer(node.right); queueParentSum.offer(ret); } } } return ans; } private void getPath(TreeNode node){ List<Integer> temp = new ArrayList<>(); while(node != null){ temp.add(node.val); node = cache.get(node); } Collections.reverse(temp); ans.add(temp); } }
參考:
https://leetcode-cn.com/problems/path-sum-ii/solution/lu-jing-zong-he-ii-by-leetcode-solution/