[LeetCode] 297. Serialize and Deserialize Binary Tree

二叉树的序列化和反序列化。题干即是题意。例子,

Example: 

You may serialize the following tree:

    1
   / \
  2   3
     / \
    4   5

as "[1,2,3,null,null,4,5]"

思路是BFS。首先是序列化。按照level order traversal的思路遍历树的节点。如果当前节点为NULL则存入"null";若不是,则正常遍历当前节点的左孩子和右孩子。

反序列化是将一个字符串的input转换成树的结构。首先将字符串中第一个node拿到,当做根节点。之后还是根据BFS的思路遍历input,如果不为"null"则做成一个节点并加入queue。

时间O(n)

空间O(n)

Java实现

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

JavaScript实现

 1 /**
 2  * Encodes a tree to a single string.
 3  *
 4  * @param {TreeNode} root
 5  * @return {string}
 6  */
 7 var serialize = function (root) {
 8     let stack = [];
 9     let serialize = [];
10     if (root == null) return [];
11     stack.push(root);
12     while (stack.length > 0) {
13         let cur = stack.shift();
14         serialize.push(cur ? cur.val : null);
15         if (cur != null) {
16             stack.push(cur.left);
17             stack.push(cur.right);
18         }
19     }
20     return serialize;
21 };
22 
23 var deserialize = function (data) {
24     if (data[0] == null) return null;
25     let node = new TreeNode(data.shift());
26     let queue = [node];
27     while (queue.length > 0) {
28         let node = queue.shift();
29         left = data.shift();
30         right = data.shift();
31         node.left = (left == null) ? null : new TreeNode(left);
32         node.right = (right == null) ? null : new TreeNode(right);
33         if (node.left != null) {
34             queue.push(node.left);
35         }
36         if (node.right != null) {
37             queue.push(node.right);
38         }
39     }
40     return node;
41 };
42 
43 /**
44  * Your functions will be called as such:
45  * deserialize(serialize(root));
46  */

猜你喜欢

转载自www.cnblogs.com/aaronliu1991/p/12453308.html