Serialize and Deserialize Binary Tree - LeetCode
아하 이제까지 리트코드에서 Tree문제가 나올 때 마다 [1,2,3,null,null,4,5]
이런식으로 주어졌는데 이형태로 만들라는 것.
(100)
이문제에서 중요한 것은,
결국 같은 레벨의 것들을 먼저 처리해야 한다는 것이었다. → 따라서 BFS를 사용하였다.
left → right 순으로 출력하는데, null 이면 null이라고 출력한다.
이건 LeetCode에서 직렬화 표기위해 사용하는 방법 참고 → where null
signifies a path terminator where no node exists below.
문자열 문제가 됨
몇 번째 글자를 추적하고 있는지 알기 위해 arr에 대한 idx 변수를 둔다.
역직렬화에서 역시 bfs를 사용해야하는 것 같다. 왜냐하면, [ 직렬화된 문자열이 root를 제외하고는, 항상 같은 레벨의 node에 대한 left, right 정보로 주어지기 때문임 ]
내가 고민했던 부분은, 현재 나의 풀이방식대로라면, 문제에서는 [1,2,3,null,null,4,5]
를 요구하는 부분이 [1,2,3,null,null,4,5,null,null,null,null]
이 나오게 된다는 것이었다. 하지만 문제를 자세히 읽어보니 이것도 괜찮았던것은 채점방식 때문이었음.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
public ArrayDeque<TreeNode> dq = new ArrayDeque<>(10000);
public StringBuilder sb = new StringBuilder("[");
public String serialize(TreeNode root) {
if(root != null){
sb.append(Integer.toString(root.val));
dq.add(root);
TreeNode temp;
while(!dq.isEmpty()) {
temp = dq.poll();
// left
sb.append(",");
if (temp.left == null) sb.append("null");
else {
sb.append(Integer.toString(temp.left.val));
dq.add(temp.left);
}
//right
sb.append(",");
if (temp.right == null) sb.append("null");
else {
sb.append(Integer.toString(temp.right.val));
dq.add(temp.right);
}
}
}
sb.append("]");
return sb.toString();
}
// util 함수
public TreeNode createNode(String str){
return new TreeNode(Integer.parseInt(str));
}
public ArrayDeque<TreeNode> deque = new ArrayDeque<>(10000);
public String[] arr;
public TreeNode deserialize(String data) {
// [] 인 경우
if(data.length()==2) return null;
data = data.substring(1,data.length()-1);
arr = data.split(",");
int idx = 0;
TreeNode root = createNode(arr[idx++]);
TreeNode temp;
deque.add(root);
while(idx < arr.length){
temp = deque.poll();
// left
if(arr[idx].equals("null"));
else{
temp.left = createNode(arr[idx]);
deque.add(temp.left);
}
idx++;
//right
if(arr[idx].equals("null"));
else{
temp.right = createNode(arr[idx]);
deque.add(temp.right);
}
idx++;
}
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));
나는 serialize 결과 역시 [1,2,3,null,null,4,5]
이런 형태로 나와야한다고 생각했어서 계속해서 bfs를 사용하였다.
하지만, 문제에서 원하는 것은 어떤 serialize 결과를 → deserialize만 잘 시키면 됐음. 그리고 deserialize 결과로는 그저, 옳바른 이진트리를 만들기만 하면 되는 거였음.
따라서, dfs 로도 풀 수 있는 문제였음.