(Tree) Path Sum
07 Nov 2019 | algorithm programming leetcode트리를 DFS로 탐색하며 최대 합인 패스의 개수를 찾는 문제이다.
class Solution { int result = 0; private void traverse(TreeNode root, int s, List<TreeNode> nodes) { if (root == null) { return; } // System.out.println(root.val); for (int i = 0; i < nodes.size(); i++) { int sum = 0; for (int j = i; j < nodes.size(); j++) { sum += nodes.get(j).val; } if (sum == s) { result++; } } nodes.add(root.left); traverse(root.left, s, nodes); nodes.remove(root.left); nodes.add(root.right); traverse(root.right, s, nodes); nodes.remove(root.right); } public int pathSum(TreeNode root, int sum) { List<TreeNode> nodes = new ArrayList<>(); nodes.add(root); traverse(root, sum, nodes); // traverse(); return result; } }
위의 방법은 시간복잡도가 좋지 않으니 아래처럼 구현하면 좋다.
class Solution { public int pathSum(TreeNode root, int sum) { if(root == null) return 0; return traverse(root, sum, 0) + pathSum(root.left, sum) + pathSum(root.right, sum); } private int traverse(TreeNode root, int sum, int currentSum) { if(root == null) return 0; if(currentSum + root.val == sum) return 1 + traverse(root.left, sum, currentSum+root.val) + traverse(root.right, sum, currentSum+root.val); else return traverse(root.left, sum, currentSum+root.val) + traverse(root.right, sum, currentSum+root.val); } }