매일 조금씩

Leet code (Hard): 297. Serialize and Deserialize Binary Tree - Java 본문

알고리즘/Tree

Leet code (Hard): 297. Serialize and Deserialize Binary Tree - Java

mezo 2024. 10. 30. 01:17
728x90
반응형

 

TreeNode 객체로 root 가 주어지면 주어진 두 메서드를 완성해서 serialize, deserialize 하여 입력 그대로의 root를 리턴하는 문제이다.

 

serialize 메서드는 String을 리턴해야해서 TreeNode를 돌며 노드를 String으로 붙여나가야하는데

String의 +보다 StringBuilder의 append()를 써서 붙여나가는 것이 훨~~~씬 더 빠르다.

String으로 + 하면서 붙이면 그때그때 계속 객체를 생성해야하기 때문..

 

deserialize 메서드는 String을 받아서 TreeNode를 리턴해야한다.

 

serialize, deserialize 둘 다 Queue를 사용했다.

 

/**
 * 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) {
        if(root == null) return "";

        StringBuilder output = new StringBuilder();
        Queue<TreeNode> queue = new LinkedList<>();

        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            
            if(node == null){
                output.append("#,");
            }else{
                output.append(node.val).append(",");
                queue.offer(node.left);
                queue.offer(node.right);
            }
        }
        
        return output.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data == "") return null;

        String[] tree = data.split(",");
        TreeNode root = new TreeNode(Integer.parseInt(tree[0]));
        
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        int child = 1;
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();

            if(!tree[child].equals("#")){
                TreeNode left = new TreeNode(Integer.parseInt(tree[child]));
                node.left = left;
                queue.offer(left);
            }

            child++;

            if(!tree[child].equals("#")){
                TreeNode right = new TreeNode(Integer.parseInt(tree[child]));
                node.right = right;
                queue.offer(right);
            }

            child++;
        }

        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));
728x90
반응형