Serialize and Deserialize Binary Tree

Solution 1)

Using a BFS, make a string by traversing by BFS.

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int val) {
        this.val = val;
        left = right = null;
    }

    public static String serialize(TreeNode root) {
        if (root == null) return "";
        Queue<TreeNode> queue = new LinkedList<>();
        StringBuffer sb = new StringBuffer();
        queue.add(root);
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node != null) {
                sb.append(node.val+",");
                queue.add(node.left);
                queue.add(node.right);
            } else {
                sb.append("*,");
            }
        }
        String s = sb.toString();
        return s.substring(0,s.length()-1);
    }

    public static TreeNode deserialize(String s) {
        if (s == null || s.length() == 0) return null;
        if (s.length() == 1 && s == "*") return null;
        Queue<TreeNode> queue = new LinkedList<>();        
        String strs[] = s.split(",");
        TreeNode root = new TreeNode(Integer.parseInt(strs[0]));
        queue.add(root);
        int i = 1;
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (!strs[i].equalsIgnoreCase("*")) {
                node.left = new TreeNode(Integer.parseInt(strs[i]));
                queue.add(node.left);
            }
            i++;
            if (!strs[i].equalsIgnoreCase("*")) {
                node.right = new TreeNode(Integer.parseInt(strs[i]));
                queue.add(node.right);
            }
            i++;
        }
        return root;

    }

    public static void printTree(TreeNode root) {
        if (root == null) System.out.println("");
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()) {
            Queue<TreeNode> queue2 = new LinkedList<>();
            while(!queue.isEmpty()) {
                TreeNode node = queue.poll();

                if (node != null) {
                    System.out.print("("+node.val+")");
                    queue2.add(node.left);
                    queue2.add(node.right);
                } else {
                    System.out.print("(*)");
                }
            }
            System.out.println();
            queue = queue2;
        }
    }

    public static void main(String args[]) {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        root.right.left = new TreeNode(6);
        root.right.right = new TreeNode(7);
        root.left.left.right = new TreeNode(8);
        root.left.right.right = new TreeNode(9);
        root.right.right.left = new TreeNode(10);
        root.right.right.right = new TreeNode(11);

        printTree(root);
        String s = serialize(root);
        System.out.println(s);
        TreeNode newRoot = deserialize(s);
        printTree(newRoot);
    }
}

Solution 2)

Using a preorder traversing, make a string

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int val) {
        this.val = val;
        left = right = null;
    }

    public static String serialize(TreeNode root) {
        if (root == null) return "*";
        Stack<TreeNode> stack = new Stack<>();
        StringBuffer sb = new StringBuffer();
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode node = stack.pop();
            sb.append(node.val+",");
            sb.append(serializePreorder(node.left)+",");
            sb.append(serializePreorder(node.right)+",");
        }
        String s = sb.toString();
        return s.substring(0,s.length()-1);
    }

    public static TreeNode helper(String s[], int[] t) {
        if (s[t[0]].equalsIgnoreCase("*")) return null;
        TreeNode node = new TreeNode(Integer.parseInt(s[t[0]]));
        t[0] = t[0] + 1;
        node.left = helper(s, t);
        t[0] = t[0] + 1;
        node.right = helper(s,t);
        return node;
    }

    public static TreeNode deserialize(String s) {
        if (s == null || s.length() == 0) return null;
        if (s.length() == 1 && s == "*") return null;
        return helper(s.split(","),new int[] {0});        
    }

    public static String serialize(TreeNode root) {
        if (root == null) return "";
        Queue<TreeNode> queue = new LinkedList<>();
        StringBuffer sb = new StringBuffer();
        queue.add(root);
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node != null) {
                sb.append(node.val+",");
                queue.add(node.left);
                queue.add(node.right);
            } else {
                sb.append("*,");
            }
        }
        String s = sb.toString();
        return s.substring(0,s.length()-1);
    }

    public static void printTree(TreeNode root) {
        if (root == null) System.out.println("");
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()) {
            Queue<TreeNode> queue2 = new LinkedList<>();
            while(!queue.isEmpty()) {
                TreeNode node = queue.poll();

                if (node != null) {
                    System.out.print("("+node.val+")");
                    queue2.add(node.left);
                    queue2.add(node.right);
                } else {
                    System.out.print("(*)");
                }
            }
            System.out.println();
            queue = queue2;
        }
    }

    public static void main(String args[]) {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        root.right.left = new TreeNode(6);
        root.right.right = new TreeNode(7);
        root.left.left.right = new TreeNode(8);
        root.left.right.right = new TreeNode(9);
        root.right.right.left = new TreeNode(10);
        root.right.right.right = new TreeNode(11);

        printTree(root);
        String s = serialize(root);
        System.out.println(s);
        TreeNode newRoot = deserialize(s);
        printTree(newRoot);
    }
}

results matching ""

    No results matching ""