TIL
[코테연습] 2096. Step-By-Step Directions From a Binary Tree Node to Another
크라00
2024. 7. 16. 16:26
- TreeNode
class Solution {
public String getDirections(TreeNode root, int startValue, int destValue) {
StringBuilder startStr = new StringBuilder();
find(root, startValue, startStr);
StringBuilder destStr = new StringBuilder();
find(root, destValue, destStr);
// 끝에서 경로를 비교하여 공통 경로 길이를 찾습니다.
int index = 0;
int maxLength = Math.min(startStr.length(), destStr.length());
while(index < maxLength && startStr.charAt(startStr.length() - index - 1) == destStr.charAt(destStr.length() -index -1)) {
++index;
}
// 결과는 일련의 'U' 문자(시작 노드에서 공통 조상으로 이동)입니다
// 그리고 나머지 경로를 따라 목적지 노드로 이동합니다.
return "U".repeat(startStr.length() - index) + destStr.reverse().toString().substring(index);
}
// 루트에서 주어진 노드까지의 경로를 값 'val'로 찾는 도우미 기능.
// 왼쪽으로 가면 'L'이, 오른쪽으로 가면 'R'이 붙습니다.
boolean find(TreeNode root, int val, StringBuilder direct) {
// 현재 노드의 값이 목표 값과 일치하면 true를 반환합니다.
if (root.val == val) {
return true;
}
// 목표값이 왼쪽 부분 트리에 있는지 확인합니다.
if (root.left != null && find(root.left, val, direct)) {
direct.append("L");
// 목표값이 오른쪽 부분 트리에 있는지 확인합니다.
} else if (root.right != null && find(root.right, val, direct)) {
direct.append("R");
}
// 경로(왼쪽 또는 오른쪽)가 발견되면 true로 반환합니다.
return direct.length() > 0;
}
}