diff --git a/src/main/java/com/ossez/lang/tutorial/models/TreeNode.java b/src/main/java/com/ossez/lang/tutorial/models/TreeNode.java
new file mode 100644
index 0000000000..8051f395f4
--- /dev/null
+++ b/src/main/java/com/ossez/lang/tutorial/models/TreeNode.java
@@ -0,0 +1,16 @@
+package com.ossez.lang.tutorial.models;
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class TreeNode {
+ public int val;
+ public TreeNode left, right;
+
+ public TreeNode(int val) {
+ this.val = val;
+ this.left = this.right = null;
+ }
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0007SerializeAndDeserialize.java b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0007SerializeAndDeserialize.java
new file mode 100644
index 0000000000..7783e4254f
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0007SerializeAndDeserialize.java
@@ -0,0 +1,131 @@
+package com.ossez.lang.tutorial.tests.lintcode;
+
+import java.util.ArrayList;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ossez.lang.tutorial.models.TreeNode;
+
+/**
+ *
+ * 7
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class LintCode0007SerializeAndDeserialize {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintCode0007SerializeAndDeserialize.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("BEGIN");
+ String data = "{3,9,20,#,#,15,7}";
+
+ System.out.println(serialize(deserialize(data)));
+
+ }
+
+ /**
+ * Deserialize from array to tree
+ *
+ * @param data
+ * @return
+ */
+ private TreeNode deserialize(String data) {
+ // NULL CHECK
+ if (data.equals("{}")) {
+ return null;
+ }
+
+ ArrayList treeList = new ArrayList();
+
+ data = data.replace("{", "");
+ data = data.replace("}", "");
+ String[] vals = data.split(",");
+
+ // INSERT ROOT
+ TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
+ treeList.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) {
+ treeList.get(index).left = node;
+ } else {
+ treeList.get(index).right = node;
+ }
+ treeList.add(node);
+ }
+
+ // LEVEL
+ if (!isLeftChild) {
+ index++;
+ }
+
+ // MOVE TO RIGHT OR NEXT LEVEL
+ isLeftChild = !isLeftChild;
+ }
+
+ return root;
+
+ }
+
+ /**
+ *
+ * @param root
+ * @return
+ */
+ public String serialize(TreeNode root) {
+ // write your code here
+ if (root == null) {
+ return "{}";
+ }
+
+ ArrayList queue = new ArrayList();
+ queue.add(root);
+
+ for (int i = 0; i < queue.size(); i++) {
+ TreeNode node = queue.get(i);
+ if (node == null) {
+ continue;
+ }
+ queue.add(node.left);
+ queue.add(node.right);
+ }
+
+ while (queue.get(queue.size() - 1) == null) {
+ queue.remove(queue.size() - 1);
+ }
+
+ StringBuilder sb = new StringBuilder();
+ sb.append("{");
+ sb.append(queue.get(0).val);
+ for (int i = 1; i < queue.size(); i++) {
+ if (queue.get(i) == null) {
+ sb.append(",#");
+ } else {
+ sb.append(",");
+ sb.append(queue.get(i).val);
+ }
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+
+}