297. Serialize and Deserialize Binary Tree

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.

For example, you may serialize the following tree

    1
   / \
  2   3
     / \
    4   5

as "[1,2,3,null,null,4,5]", just the same as how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.

 

Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.


 

 

这种serialization的方法很好看,用的是preOrder, 用途很广,做法也是挺漂亮的

1. cc150里面的找一个超大的树A是不是另一个超大的树B的子树,也可以先压扁,然后如果一个树的序列是另外一个数序列的子串,那么就是子树

2. snapchat有个面经,“是从binary tree里找出所有duplicate的树。return应该是一个key value pair,key是任何形式表示的树,value是这个树出现的次数。我的大致思路就是对每个node,做出以这个node为根的树的serialization。然后以这个serialization为key扔到hashtable里就可以。followup就是问时间和空间复杂度。”也是可以把每一个node压扁了,然后用hashSet统计出现的次数

 

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Codec {
11     
12     // Encodes a tree to a single string.
13     public String serialize(TreeNode root) {
14         StringBuilder sb = new StringBuilder();
15         getSerialization(root, sb);
16         return sb.toString();
17     }
18     
19     private void getSerialization(TreeNode root, StringBuilder sb) {
20         if(root == null) {
21             sb.append("#").append(",");
22             return;
23         }
24         sb.append(root.val + ",");
25         getSerialization(root.left, sb);
26         getSerialization(root.right, sb);
27     }
28 
29     // Decodes your encoded data to tree.
30     public TreeNode deserialize(String data) {
31         String[] nodes = data.split(",");
32         Queue<String> queue = new LinkedList<>();
33         queue.addAll(Arrays.asList(nodes));
34         return getTree(queue);
35     }
36     
37     private TreeNode getTree(Queue<String> queue) {
38         String cur = queue.poll();
39         TreeNode root = null;
40         if(cur.equals("#")) {
41             return root;
42         } else {
43             root = new TreeNode(Integer.parseInt(cur));
44             root.left = getTree(queue);
45             root.right = getTree(queue);
46         }
47         return root;
48     }
49 }
50 
51 // Your Codec object will be instantiated and called as such:
52 // Codec codec = new Codec();
53 // codec.deserialize(codec.serialize(root));

 

posted @ 2016-10-31 12:32  warmland  阅读(224)  评论(0编辑  收藏  举报