직렬 화 및 Deserialize 바 이 너 리 트 리 이 진 트 리 직렬 화 반 직렬 화

LeetCode 297. Serialize and Deserialize Binary Tree
제목:이 진 트 리 를 직렬 화하 고 직렬 화 된 String 으로 돌아 가 반 직렬 화 복원 합 니 다.
문제 풀이 사고:기 교 는 null 을\#로 기록 하여 미래 판단 에 편리 하 게 하 는 것 이다.두 가지 해법 이 있다.
  • Level Order Traversal-BFS 의 사상 은 각 층 을 기록 하고 반 서열 화 할 때 도 등급 별로 옮 겨 다 니 는 방법 에 따라 이전 quue 안의 요소 인 왼쪽 아이 와 오른쪽 아이 로 순서대로 설정 합 니 다
  • 더 좋 은 방법 은 preorder traversal 입 니 다.handle 변종 문 제 를 풀 수 있 는 해법 입 니 다.preorder 는 root->left->right 의 순 서 를 이용 하여 하나의 deque 로 머리 에 있 는 요 소 를 계속 poll 로 내 보 내 고 재 귀적 호출 함수 로 복원 이 진 트 리 를 구축 합 니 다
  •     //Solution 1: using Level order traversal
        public static String serialize(TreeNode root) {
            if (root == null ) {
                return "";
            }
    
            StringBuilder sb = new StringBuilder();
            Queue q = new LinkedList();
            q.offer(root);
            while(!q.isEmpty()) {
                TreeNode curr = q.poll();
                if (curr == null) {
                    sb.append("#,");
                } else {
                    sb.append(curr.val + ",");
                    q.offer(curr.left);
                    q.offer(curr.right);
                }
            }
            sb.deleteCharAt(sb.length() - 1);
            return sb.toString();
        }
    
        /**
         *      1
         *     / \
         *    2   3
         *   /   / \
         *  4   2   4
         *  /
         * 4
         * [1,2,3,4,#,2,4,4]
         * @param input
         * @return
         */
    
        public static TreeNode deSerialize(String input) {
            if (input == null || input.length() == 0) {
                return null;
            }
            String[] strs = input.split(",");
            TreeNode root = new TreeNode(Integer.valueOf(strs[0]));
            Queue q = new LinkedList();
            q.offer(root);
    
            for(int i = 1; i < strs.length; i++){
                TreeNode curr = q.poll();
                if (curr == null) continue;
                if (!strs[i].equals("#")) {
                    curr.left = new TreeNode(Integer.valueOf(strs[i]));
                    q.offer(curr.left);
                }
    
                i++;
    
                if (i < strs.length && !strs[i].equals("#")) {
                    curr.right = new TreeNode(Integer.valueOf(strs[i]));
                    q.offer(curr.right);
                }
    
            }
            return root;
    
        }
        //Solution II: using 2 preorder traversal
        private static final String DELIMITER = ",";
        private static final String NN = "#";
    
        // Encodes a tree to a single string.
        public static String serialize2(TreeNode root) {
            //using preorder traversal
            StringBuilder res = new StringBuilder();
            serializeHelper(root, res);
            res.deleteCharAt(res.length() - 1);
            return res.toString();
        }
        private static void serializeHelper(TreeNode root, StringBuilder res) {
            if (root == null) {
                res.append(NN).append(DELIMITER);
                return;
            }
            res.append(root.val).append(DELIMITER);
            serializeHelper(root.left, res);
            serializeHelper(root.right, res);
        }
    
        // Decodes your encoded data to tree.
        public static TreeNode deserialize2(String data) {
            Deque deque = new LinkedList<>();
            deque.addAll(Arrays.asList(data.split(DELIMITER)));
            return deserializeHelper(deque);
        }
        private static TreeNode deserializeHelper(Deque deque) {
            String now = deque.pollFirst();
            if (now.equals(NN)) {
                return null;
            }
            TreeNode node = new TreeNode(Integer.parseInt(now));
            node.left = deserializeHelper(deque);
            node.right = deserializeHelper(deque);
            return node;
        }
        public static void main(String[] args) {
            //solution 1 level order
            TreeNode root1 = deSerialize("1,2,3,4,#,5,6,7");
            String result1 = serialize(root1);
            System.out.println(result1);
    
            //solution 2 preorder -   ,        LinkedList,   String
            TreeNode root2 = deserialize2("3,4,1,#,#,2,#,#,5,#,6,#,#");
            String result2 = serialize2(root2);
    
            System.out.println(result2);
    
        }

    좋은 웹페이지 즐겨찾기