1 minute read

이진 트리 직렬화 & 역직렬화

https://leetcode.com/problems/serialize-and-deserialize-binary-tree

문제 : 이진 트리를 배열로 직렬화하고, 반대로 역직렬화하는 기능 구현하라.

  • 직렬화 TreeNode -> String
  • 역직렬화 Stirng -> TreeNode

입출력

입력: root = [1,2,3,null,null,4,5]
출력: [1,2,3,null,null,4,5]

풀이

bfs를 사용하여 직렬화와 역직렬화를 구현하였다.
큐를 사용하여 동작을 반복한다.

역직렬화 부분이 약간 헷갈렸는데,
1) String 배열에 Split해서 값 셋팅
2) TreeNode Queue에 new TreeNode로 root 넣고 시작
3) 큐의 root 빼서 왼쪽, 오른쪽 값 채워서 큐에 넣기
.. 반복(큐가 비어있을 때 까지)

큐를 사용하지 않고 for 반복문으로 왼쪽 오른쪽 입력을 하면 될 것 같지만 깊이를 내려가지 않는다면 제자리를 반복하게 될 수 있다.
TreeNode로 구성된 Queue를 사용하여 사용했던 트리의 왼쪽 오른쪽을 넣었다가, 다시 빼서 하위의 왼쪽 오른쪽 값을 넣는 식으로 깊이를 내려가도록 한다.

트리 구조의 구성을 생각해보도록 하는 문제였다.

import java.util.*;
public class Codec {

    // 직렬화
    public String serialize(TreeNode root) {
        Queue<TreeNode> q = new LinkedList<>();
        if(root == null) {
           return ""; 
        }
        String result = String.valueOf(root.val);
        q.add(root);
        while(!q.isEmpty()) {
           TreeNode tree = q.poll();
           if(tree != null) {
               if(tree.left != null) {
                    q.add(tree.left);
                    result += ","+tree.left.val;
               } else {
                    result += ",null";
               }
               if(tree.right != null) {
                    q.add(tree.right);
                    result += ","+tree.right.val;
               } else {
                    result += ",null";
               }
            }   
        }
        return result;
    }

    // 역직렬화
    public TreeNode deserialize(String data) {
        if("".equals(data)) {
            return null;
        }
        Queue<TreeNode> q = new LinkedList<>();
        String[] str = data.split(",");
        
        TreeNode root = new TreeNode(Integer.parseInt(str[0]));
        q.add(root);
        int idx = 1;
        while(!q.isEmpty()) {
            TreeNode tree = q.poll();
            if(!"null".equals(str[idx])) {
                tree.left = new TreeNode(Integer.parseInt(str[idx]));
                q.add(tree.left);
            }
            idx += 1;
            if(!"null".equals(str[idx])) {
                tree.right = new TreeNode(Integer.parseInt(str[idx]));
                q.add(tree.right);
            }
            idx+=1;
        }
        return root;
    }
}