Leetcode Java Serialize and Deserialize BST
업데이트:
문제
코드
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
this.serialize(sb, root);
return sb.toString();
}
private void serialize(StringBuilder sb, TreeNode root) {
if (root != null) {
sb.append((char) (root.val + '0'));
this.serialize(sb, root.left);
this.serialize(sb, root.right);
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
TreeNode root = null;
for (char c : data.toCharArray()) {
root = this.add(root, c - '0');
}
return root;
}
private TreeNode add(TreeNode root, int val) {
if (root == null) {
return new TreeNode(val);
} else {
if (val < root.val) {
root.left = this.add(root.left, val);
} else {
root.right = this.add(root.right, val);
}
return root;
}
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// String tree = ser.serialize(root);
// TreeNode ans = deser.deserialize(tree);
// return ans;
결과
설명
- 이진 검색 트리(BST)를 직렬화, 역직렬화를 수행하는 Codec 클래스를 완성하는 문제이다.
- 메서드인 serialize(TreeNode root)는 주어진 root를 문자열로 직렬화하는 기능을 수행한다.
- 메서드인 deserialize(String data)는 주어진 data를 TreeNode로 역직렬화하는 기능을 수행한다.
- serialize(TreeNode root) 메서드를 완성한다.
- root를 직렬화 하여 저장할 변수 sb를 정의하고, StringBuilder로 초기화한다.
- 3번에서 정의한 serialize(StringBuilder sb, TreeNode root) 메서드를 이용하여 root를 직렬화한 값을 sb에 넣어준다.
- 직렬화된 값이 저장된 sb를 문자열로 변환하여 반환한다.
- root를 재귀 호출을 이용하여 직렬화 하는 serialize(StringBuilder sb, TreeNode root) 메서드를 완성한다.
- root가 null이 아닐 경우 아래를 수행한다.
- sb에 root의 val 값을 문자로 치환하여 넣어준다.
- left를 이용하여 재귀 호출을 수행하여 sb에 좌측 TreeNode들의 val 값을 직렬화 하여 넣어준다.
- right를 이용하여 재귀 호출을 수행하여 sb에 우측 TreeNode들의 val 값을 직렬화 하여 넣어준다.
- root가 null이 아닐 경우 아래를 수행한다.
- deserialize(String data) 메서드를 완성한다.
- data를 TreeNode로 변환하기 위한 root를 정의한다.
- data의 각 문자를 반복하여 5번에서 정의한 add(TreeNode root, int val) 메서드로 역직렬화를 수행하여 root에 넣어준다.
- 반복이 완료되면 역직렬화된 root를 반환한다.
- root에 val 값을 이용하여 TreeNode를 완성하기 위한 add(TreeNode root, int val) 메서드를 완성한다.
- root가 null인 경우 최상위 노드이므로, val을 이용하여 새 TreeNode를 만들어 반환한다.
- root가 null이 아닌 경우 아래를 수행한다.
- val 값이 root의 val 미만인 경우 해당 노드 좌측에 위치한 노드이므로, root의 left에 root의 left와 val을 이용한 값을 재귀 호출한 결과를 넣어준다.
- val 값이 root의 val 이상인 경우 해당 노드 우측에 위치한 노드이므로, root의 right에 root의 right와 val을 이용한 값을 재귀 호출한 결과를 넣어준다.
- 위의 수행이 완료되면 root를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기