풀이 코드
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*
* 1. 문제 해석하기
* 이진 탐색 트리의 가장 낮은 공통 조상을 찾아달라는 문제입니다.
* 2. 문제 풀이 방법
* TreeNode를 따라 내려간다.
* left의 val 혹은 right의 val이 p혹은 q일 경우 그 다음 값도 확인한다.
* 조상이 p 혹은 q 인 경우도 있기 때문에 해당 경우도 고려한다.
* 같은 숫자를 가진 노드는 없다.
*
* p의 조상 목록과 q의 조상 목록을 찾는다. (가장 처음은 root가 되고 가장 마지막이 lowest할 것)
* 마지막부터 조상 목록 비교 후 같은 조상을 반환한다.
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
List<TreeNode> list1 = new ArrayList<>();
List<TreeNode> list2 = new ArrayList<>();
boolean left = find(root, list1, p);
boolean right = find(root, list2, q);
TreeNode result = findLCA(list1, list2);
return result;
}
public TreeNode findLCA(List<TreeNode> list1, List<TreeNode> list2) {
int i = 0;
for(i = 0; i < list1.size() && i < list2.size(); i++) {
if (list1.get(i).val != list2.get(i).val) {
break;
}
}
return list1.get(i - 1);
}
public boolean find(TreeNode root, List<TreeNode> list, TreeNode a) {
if (root == null) {
return false;
}
list.add(root);
if (root.val == a.val || find(root.left, list, a) || find(root.right, list, a)) {
return true;
}
list.remove(list.size() - 1);
return false;
}
}
조상 목록을 찾아서 비교해야지! 까지는 생각해냈는데
목록을 어떻게 찾아내야하는지, 가지고온 목록을 어떻게 비교해야하는지 하는 부분에서 막혀서 한참 고민하다가 풀이 참고해서 풀었다.
아직 많이 부족한 것 같다.
'코딩테스트' 카테고리의 다른 글
141. Linked List Cycle (0) | 2024.01.29 |
---|---|
21. Merge Two Sorted Lists (0) | 2024.01.29 |
Valid Palindrome (0) | 2024.01.18 |
[leetcode] 46. Permutations (0) | 2023.09.16 |
[leetcode] 45. Jump Game II (0) | 2023.09.16 |