Leetcode Java Serialize and Deserialize Binary Tree
업데이트:
문제
코드
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
return this.serialize(root, new StringBuilder()).toString();
}
private StringBuilder serialize(TreeNode root, StringBuilder stringBuilder) {
if (root == null) {
return stringBuilder.append(".");
}
stringBuilder.append(root.val).append(",");
this.serialize(root.left, stringBuilder);
stringBuilder.append(",");
this.serialize(root.right, stringBuilder);
return stringBuilder;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
return this.deserialize(new LinkedList<>(Arrays.asList(data.split(","))));
}
private TreeNode deserialize(Queue<String> queue) {
String val = queue.poll();
if (".".equals(val)) {
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(val));
root.left = this.deserialize(queue);
root.right = this.deserialize(queue);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));
결과
설명
- TreeNode를 serialize하고 deserialize하여 원래 TreeNode를 복원하는 Codec 클래스를 완성하는 문제이다.
- 메서드인 serialize(TreeNode root)는 주어진 TreeNode인 root를 문자열로 변경한다.
- 메서드인 deserialize(String data)는 주어진 String인 data는 TreeNode를 문자열로 변경한 값으로, 해당 값을 이용하여 TreeNode로 복원한다.
- 주어진 메서드인 serialize(TreeNode root)를 완성하기 위해 재귀 호출용 메서드 serialize(TreeNode root, StringBuilder stringBuilder)를 완성한다.
- root가 null인 경우, stringBuilder에 마침표(“.”)를 넣어준다.
- 그 외의 경우 root.val과 콤마(“,”)를 순차적으로 넣어준다.
- root의 left TreeNode를 재귀 호출을 이용하여 stringBuilder에 순차적으로 값을 넣어준다.
- root의 left TreeNode의 재귀 호출이 완료되면 콤마(“,”)를 넣어 값을 구분해준다.
- root의 right TreeNode를 재귀 호출을 이용하여 stringBuilder에 순차적으로 값을 넣어준다.
- 위의 수행 결과로 완성된 stringBuilder를 반환한다.
- 주어진 메서드인 serialize(TreeNode root)를 완성한다.
- 2번에서 만든 serialize(TreeNode root, StringBuilder stringBuilder)를 주어진 TreeNode인 root와 새 StringBuilder 클래스를 생성하여 수행한 결과를 문자열로 치환하여 반환한다.
- 동적 문자열의 생성시, 효율적인 메모리 사용을 위해 StringBuilder를 사용한다.
- 주어진 메서드인 deserialize(String data)를 완성하기 위해 재귀 호출용 메서드 deserialize(Queue
queue)를 완성한다. - queue에서 값을 꺼내 지역 변수 val에 넣어준다.
- val 값이 마침표(“.”)인 경우 null인 TreeNode이므로, null을 반환한다.
- val 값을 정수형으로 변경하여 새 TreeNode를 root로 정의한다.
- root의 left TreeNode에 queue를 이용한 재귀 호출 결과인 TreeNode를 넣어준다.
- root의 right TreeNode에 queue를 이용한 재귀 호출 결과인 TreeNode를 넣어준다.
- 위의 수행 결과로 완성된 TreeNode를 반환한다.
- 주어진 메서드인 deserialize(String data)를 완성한다.
- 4번에서 만든 deserialize(Queue
queue)를 data를 콤마(",")로 분리한 배열을 List형으로 변환하여 새 LinkedList로 만들어 수행한 결과를 반환한다.
- 4번에서 만든 deserialize(Queue
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기