Leetcode Java Find Duplicate Subtrees
업데이트:
문제
코드
class Solution {
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
List<TreeNode> result = new ArrayList<>();
this.dfs(root, new HashMap<>(), result);
return result;
}
private String dfs(TreeNode treeNode, Map<String, Integer> map, List<TreeNode> result) {
if (treeNode == null) {
return ".";
}
String subTree = new StringBuilder()
.append(treeNode.val)
.append(",")
.append(this.dfs(treeNode.left, map, result))
.append(",")
.append(this.dfs(treeNode.right, map, result))
.toString();
map.put(subTree, map.getOrDefault(subTree, 0) + 1);
if (map.get(subTree) == 2) {
result.add(treeNode);
}
return subTree;
}
}
결과
설명
-
root 내 중복된 TreeNode를 반환하는 문제이다.
- 결과를 넣을 result를 정의하고, ArrayList로 초기화한다.
- 3번에서 정의한 dfs(TreeNode treeNode, Map<String, Integer> map, List
result) 메서드에 root와 새 HashMap, result를 넣고 수행한다.
- 3번에서 정의한 dfs(TreeNode treeNode, Map<String, Integer> map, List
- DFS preorder로 탐색을 수행할 dfs(TreeNode treeNode, Map<String, Integer> map, List
result) 메서드를 정의한다. - treeNode가 null인 경우 임의 값인, “.”를 반환한다.
- subTree에 아래를 순차적으로 넣은 StringBuilder를 문자열로 변환하여 넣어준다.
- treeNode.val와 “,”를 순차적으로 넣어준다.
- treeNode의 left TreeNode를 이용하여 재귀 호출을 수행한 결과를 넣고 “,”를 넣어준다.
- 마지막으로 treeNode의 right TreeNode를 이용하여 재귀 호출을 수행한 결과를 넣어준다.
- map의 subTree에 해당하는 값이 있으면 가져오고, 없으면 0을 가져와 1을 더한 값을 다시 map의 subTree에 해당하는 값에 넣어준다.
- 만일 map의 subTree번째 값이 2인 경우 중복된 subTree이므로, result에 subTree를 넣어준다.
- 수행이 완료되면 subTree를 반환한다.
- 모든 중복된 subTree의 preorder 값들을 저장한 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기