• LeetCode 297. Serialize and Deserialize Binary Tree


    原题链接在这里:https://leetcode.com/problems/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.

    题解:

    把一个树serialize 和 deserialize. 可以通过pre-order 或者 level order traversal.

    用pre-order:

        1
       / 
      2   3
         / 
        4   5

    例子就变成了"1,2,#,#,3,4,#,#,5,#,#". 然后deserialize先读入一个字符作为根节点,然后根节点的左右子节点递归调用deserializeHelper函数.

    deserialize 时按"," 拆开,遇到"#"就是 null节点.

    Note: LinkedList AddAll only works for Collection<>, array is not Collection<>. Thus it needs to use Arrays.asList(arr).

    Time Complexity: serialize, O(n). deserialize, O(n). Space: O(n).

    AC Java:

     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         preorder(root, sb);
    16         return sb.toString();
    17     }
    18     private void preorder(TreeNode root, StringBuilder sb){
    19         if(root == null){
    20             sb.append("#").append(",");
    21             return;
    22         }
    23         sb.append(root.val).append(",");
    24         preorder(root.left, sb);
    25         preorder(root.right, sb);
    26     }
    27 
    28     // Decodes your encoded data to tree.
    29     public TreeNode deserialize(String data) {
    30         LinkedList<String> que = new LinkedList<String>();
    31         que.addAll(Arrays.asList(data.split(",")));
    32         return deserial(que);
    33     }
    34     
    35     private TreeNode deserial(LinkedList<String> que){
    36         String str = que.pollFirst();
    37         if(str.equals("#")){
    38             return null;
    39         }
    40         TreeNode root = new TreeNode(Integer.valueOf(str));
    41         root.left = deserial(que);
    42         root.right = deserial(que);
    43         return root;
    44     }
    45 }
    46 
    47 // Your Codec object will be instantiated and called as such:
    48 // Codec codec = new Codec();
    49 // codec.deserialize(codec.serialize(root));

    Iteration 方法使用的BFS. 当处理serialize, queue不为空时,弹出节点cur, 若cur是null, 就在sb后面加上"#,"; 若不是null, 就在sb后面加上cur.val 和 ",".

    处理deserialize时,先把string 用"," 格成string 数组。 如果是满树,那么左节点index就是2*i+1, 右节点index是2*i+2. 但这里不是满树。

    需要同时记录当前i前面有几个null节点,用count存储,左节点index变成2*(i-count[i]) + 1, 右节点index变成2*(i-count[i]) + 2.

    Note: 记住Queue 是 abstract class, 不能直接用来生成 que, 需要用LinkedList.

    AC Java:

     1 public class Codec {
     2 
     3     // Encodes a tree to a single string.
     4     public String serialize(TreeNode root) {
     5         StringBuilder sb = new StringBuilder();
     6         Queue<TreeNode> que = new LinkedList<TreeNode>(); //error
     7         que.offer(root);
     8         while(!que.isEmpty()){
     9             TreeNode cur = que.poll();
    10             if(cur == null){
    11                 sb.append("#,");
    12             }else{
    13                 sb.append(cur.val).append(",");
    14                 que.offer(cur.left);
    15                 que.offer(cur.right);
    16             }
    17         }
    18         return sb.toString();
    19     }
    20 
    21     // Decodes your encoded data to tree.
    22     public TreeNode deserialize(String data) {
    23         String [] s = data.split(",");
    24         int [] count = new int[s.length];
    25         TreeNode [] tns = new TreeNode[s.length];
    26         
    27         for(int i = 0; i<s.length; i++){
    28             if(i>0){
    29                 count[i] = count[i-1];
    30             }
    31             if(s[i].equals("#")){
    32                 tns[i] = null;
    33                 count[i]++;
    34             }else{
    35                 tns[i] = new TreeNode(Integer.valueOf(s[i]));
    36             }
    37         }
    38         
    39         for(int i = 0; i<s.length; i++){
    40             if(s[i].equals("#")){
    41                 continue;
    42             }
    43             tns[i].left = tns[2 * (i-count[i]) + 1];
    44             tns[i].right = tns[2 * (i-count[i]) + 2];
    45         }
    46         return tns[0];
    47     }
    48 }

    类似Serialize and Deserialize BSTSerialize and Deserialize N-ary TreeEncode and Decode StringsFind Duplicate Subtrees.

    Reference: http://blog.csdn.net/ljiabin/article/details/49474445

  • 相关阅读:
    .net中的正则表达式使用高级技巧 (二)
    经典的LZW算法C语言实现
    .net中的正则表达式使用高级技巧
    Atlas应用程序调试技巧
    从毕业到现在是如何走来的!!!
    关于JS的一些实际问题
    js学习笔记(十四)事件处理模型
    js学习笔记(十一)窗口和框架
    关于css的一些问题
    浏览器布局BUG汇总
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4934908.html
Copyright © 2020-2023  润新知