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 search tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary search tree can be serialized to a string and this string can be deserialized to the original tree structure.
The encoded string should be as compact as possible.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
Serialization: preorder root -> left -> right;
Deserialize: preorder得到的序列 用dfs 先找root
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Codec { // Encodes a tree to a single string. public String serialize(TreeNode root) { StringBuilder sb = new StringBuilder(); serializeDFS(root, sb); //preorder root - left - right return sb.toString(); } public void serializeDFS(TreeNode root, StringBuilder sb){ if(root == null) return; sb.append(root.val).append(","); serializeDFS(root.left, sb); serializeDFS(root.right, sb); } // Decodes your encoded data to tree. public TreeNode deserialize(String data) { if(data == null || data.length() == 0) return null; String arr[] = data.split(","); return deserializeDFS(arr, 0, arr.length-1); } public TreeNode deserializeDFS(String[] array, int left, int right){ if(left > right || left >= array.length) return null; TreeNode root = new TreeNode(Integer.parseInt(array[left])); int mid = getMid(array, left, right); root.left = deserializeDFS(array, left + 1, mid - 1); root.right = deserializeDFS(array, mid, right); return root; } public int getMid(String[] array, int left, int right){ int index = 0; System.out.println(left); int init = Integer.parseInt(array[left]); while(left <= right){ if(init < Integer.parseInt(array[left])) { break; } else left++; } return left; } } // Your Codec object will be instantiated and called as such: // Codec codec = new Codec(); // codec.deserialize(codec.serialize(root));