297. Serialize and Deserialize Binary Tree

有多种做法。
我喜欢用recursion的写法。这样代码好写一点。

public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        helper(root, sb);
        return sb.toString();
    }
    private void helper(TreeNode root, StringBuilder sb) {
        if (root == null) return;
        sb.append(root.val);
        sb.append(",");
        int numberOfChild = (root.left == null ? 0 : 1 ) + (root.right == null ? 0 : 2);
        sb.append(numberOfChild);
        sb.append(",");
        helper(root.left, sb);
        helper(root.right, sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        int[] pos = new int[1]; //老是写成new int[0]; 应该是1。
        return helperDes(data, pos);
    }
    private TreeNode helperDes(String data, int[] pos) {
        int[] values = getData(data, pos);
        //base case
        if (values == null) return null;
        // root
        TreeNode root = new TreeNode(values[0]);
        //left
        if (values[1] % 2 == 1) root.left = helperDes(data, pos);
        //right
        if (values[1] > 1) root.right = helperDes(data, pos);
        
        //return
        return root;
    }
    private int[] getData(String data, int[] pos) {
        int index = pos[0];
        //base case
        if (index >= data.length()) return null;
        // get first one
        int fast = index;
        
        while (data.charAt(fast + 1) != ',') {
            fast++;
        }
        int number1 = Integer.parseInt(data.substring(index, fast + 1));
        index = fast + 2;
        //get second one;
        
        fast = index;
        while (data.charAt(fast + 1) != ',') {
            fast++;
        }
        int number2 = Integer.parseInt(data.substring(index, fast + 1));
        // increase index
        pos[0] = index + 2;
        //return ans
        return new int[]{number1, number2};
    }
}

这是Level order traversal的写法。注意不需要特殊记住分层。会自然推出来的。

public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        Queue queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                if (node == null) {
                    sb.append('#');
                } else {
                    sb.append(node.val);
                    queue.offer(node.left);
                    queue.offer(node.right);
                }
                sb.append(',');
            }
        }
        return sb.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        Queue queue = new LinkedList<>();
        int[] pt = new int[1];
        TreeNode dummy = new TreeNode(0);
        queue.offer(dummy);
        while (pt[0] < data.length()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode parent = queue.poll();
                String l = getData(data, pt);
                if ("#".equals(l)) {
                    parent.left = null;
                } else {
                    parent.left = new TreeNode(Integer.parseInt(l));
                    queue.offer(parent.left);
                }
                if (parent == dummy) continue;
                String r = getData(data, pt);
                if ("#".equals(r)) {
                    parent.right = null;
                } else {
                    parent.right = new TreeNode(Integer.parseInt(r));
                    queue.offer(parent.right);
                }
            }
        }
        return dummy.left;
    }
    private String getData(String data, int[] pt) {
        int fast = pt[0];
        while ( fast + 1 < data.length() && data.charAt(fast + 1) != ',') {
            fast++;
        }
        String ans = data.substring(pt[0], fast + 1);
        pt[0] = fast + 2;
        return ans;
    }
}

你可能感兴趣的:(297. Serialize and Deserialize Binary Tree)