Binary Tree Serialization

An example of testdata: Binary tree {3,9,20,#,#,15,7}, denote the following structure:

  3
 / \
9  20
  /  \
 15   7

{3,9,20,#,#,15,#,#,7,#,#,}

public class Codec {
    public String serialize(TreeNode root) {
        if (root == null) {
            return "{}";
        }

        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);

        StringBuilder sb = new StringBuilder();
        sb.append("{");

        while(!queue.isEmpty()){
            TreeNode cur = queue.poll();
            if (cur == null) {
                sb.append("#,");
            } else {

                sb.append(cur.val);
                sb.append(",");
                queue.offer(cur.left);
                queue.offer(cur.right);                
            }
        }

        sb.append("}");
        return sb.toString();
    }

    /**
     * This method will be invoked second, the argument data is what exactly
     * you serialized at method "serialize", that means the data is not given by
     * system, it's given by your own serialize method. So the format of data is
     * designed by yourself, and deserialize it here as you serialize it in 
     * "serialize" method.
     */
    public TreeNode deserialize(String data) {
        if (data.equals("{}")) {
            return null;
        }
        String[] vals = data.substring(1, data.length() - 1).split(",");
        ArrayList<TreeNode> queue = new ArrayList<TreeNode>();
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        queue.add(root);
        int index = 0;
        boolean isLeftChild = true;
        for (int i = 1; i < vals.length; i++) {
            if (!vals[i].equals("#")) {
                TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
                if (isLeftChild) {
                    queue.get(index).left = node;
                } else {
                    queue.get(index).right = node;
                }
                queue.add(node);
            }
            if (!isLeftChild) {
                index++;
            }
            isLeftChild = !isLeftChild;
        }
        return root;
    }
}

ebay变形题目,要求不是二叉树,child有一个list

我的表示方法{3@2,9@0,20@2,15@1,7@2,21@0,8@0,10@0,}

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;


class TreeNode{
    int val;
    List<TreeNode> next;

    public TreeNode(int val){
        this.val = val;
        this.next = new ArrayList<TreeNode>();
    }
}

class Point{
    TreeNode node;
    int size;
    public Point(TreeNode node, int size){
        this.node = node;
        this.size = size;
    }
}

public class serialize {

       public static String serialize(TreeNode root) {
            if (root == null) {
                return "{}";
            }

            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);

            StringBuilder sb = new StringBuilder();
            sb.append("{");

            while(!queue.isEmpty()){
                TreeNode cur = queue.poll();
                sb.append(cur.val);
                sb.append("@");
                sb.append(cur.next.size());
                sb.append(",");
                if(cur.next.size() != 0){
                    for(TreeNode temp : cur.next){
                        queue.offer(temp);
                    }               
                }
            }

            sb.append("}");
            return sb.toString();
        }


        public static TreeNode deserialize(String data) {
            if (data.equals("{}")) {
                return null;
            }
            String[] vals = data.substring(1, data.length() - 1).split(",");
            ArrayList<Point> queue = new ArrayList<Point>();
            String[] val = vals[0].split("@");
            TreeNode root = new TreeNode(Integer.parseInt(val[0]));
            Point point = new Point(root,Integer.parseInt( val[1]));
            queue.add(point);
            int index = 0;
            int count = 0;
            for (int i = 1; i < vals.length; i++) {
                if(queue.get(index).size == count ){
                    count = 0;
                    index++;
                    i--;
                    continue;
                }
                String[] cur = vals[i].split("@");
                TreeNode node = new TreeNode(Integer.parseInt(cur[0]));
                queue.get(index).node.next.add(node);
                Point next_point = new Point(node, Integer.parseInt(cur[1]));
                queue.add(next_point);
                count++;

            }
            return root;
        }    




    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TreeNode root = new TreeNode(3);
        TreeNode t9 = new TreeNode(9);
        TreeNode t20 = new TreeNode(20);        
        TreeNode t15 = new TreeNode(15);            
        TreeNode t7 = new TreeNode(7);
        TreeNode t21 = new TreeNode(21);
        TreeNode t8 = new TreeNode(8);
        TreeNode t10 = new TreeNode(10);
        root.next.add(t9);
        root.next.add(t20);
        t20.next.add(t15);
        t20.next.add(t7);
        t15.next.add(t21);
        t7.next.add(t8);
        t7.next.add(t10);
        System.out.println(serialize(root) );


        TreeNode cur = deserialize(serialize(root));
        System.out.println(serialize(cur) );
    }

}

results matching ""

    No results matching ""