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 로도 풀 수 있는 문제였음.