Leetcode Java Recover a Tree From Preorder Traversal
업데이트:
문제
코드
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int index = 0;
public TreeNode recoverFromPreorder(String traversal) {
return this.dfs(traversal, 0);
}
private TreeNode dfs(String traversal, int depth) {
int num = 0;
while (this.index + num < traversal.length() && traversal.charAt(this.index + num) == '-') {
num++;
}
if (num != depth) {
return null;
}
int next = this.index + num;
while (next < traversal.length() && traversal.charAt(next) != '-') {
next++;
}
int val = Integer.parseInt(traversal.substring(this.index + num, next));
this.index = next;
TreeNode root = new TreeNode(val);
root.left = this.dfs(traversal, depth + 1);
root.right = this.dfs(traversal, depth + 1);
return root;
}
}
결과
설명
-
preorder로 깊이를 대시(‘-‘) 문자의 갯수로 구분된 문자열 traversal을 이용하여 TreeNode를 구성하는 문제이다.
-
index는 traversal 문자열의 위치를 저장할 전역 변수로, 0으로 초기화한다.
-
4번에서 정의한 dfs(String traversal, int depth)를 depth에 0을 넣어 수행한 결과를 주어진 문제의 결과로 반환한다.
-
DFS 방식으로 TreeNode를 구성하기 위한 dfs(String traversal, int depth) 메서드를 정의한다.
- num은 대시(‘-‘) 문자의 갯수를 저장할 변수로, $index + num$이 traversal의 길이 미만이면서 traversal의 해당 위치의 문자가 ‘-‘일때 까지 num을 증가시키며 대시(‘-‘) 문자의 갯수를 저장한다.
- num이 depth가 아닌 경우, 연결된 TreeNode가 아니므로 null을 반환한다.
- next는 다음 숫자의 위치를 저장할 변수로, $index + num$을 넣어 초기화한다.
- 다시 next가 traversal의 길이 미만이면서 대시(‘-‘) 문자가 아닐 때 까지 next를 이동시켜준다.
- val에 traversal의 [$index + num$, next] 까지 숫자를 정수로 변환하여 넣어준다.
- root에 val 값을 이용하여 TreeNode를 만들어 넣어준다.
- preorder 순으로 TreeNode를 구성하기 위하여 아래를 순차적으로 수행한다.
- root의 left TreeNode에 $depth + 1$을 이용하여 재귀 호출한 결과를 넣어준다.
- root의 right TreeNode에 $depth + 1$을 이용하여 재귀 호출한 결과를 넣어준다.
- 위를 이용하여 만들어진 TreeNode인 root를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기