解决思路
深度优先搜索

Binary Search Tree 的序列化本质上是对其值进行编码,更重要的是对其结构进行编码。可以遍历树来完成上述任务。众所周知,我们有两个一般策略:
广度优先搜索(BFS)
我们按照高度的顺序从上到下逐级扫描树。更高级别的节点将先于较低级别的节点访问。
深度优先搜索(DFS)
在这个策略中,我们采用深度作为优先顺序,这样我们就可以从一个根开始,一直延伸到某个叶,然后回到根,到达另一个分支。
根据根节点、左节点和右节点之间的相对顺序,可以进一步将DFS策略区分为 preorder、inorder 和 postorder 。
然而,在这个任务中,DFS 策略更适合我们的需要,因为相邻节点之间的链接自然地按顺序编码,这对后面的反序列化任务非常有帮助。
因此,在这个解决方案中,我们用 preorder DFS 策略演示了一个示例。您可以在 leetcode explore上查看有关二叉搜索树的更多教程。
我们从根节点 1 开始,序列化字符串是 1,。然后我们跳到根节点 2 的左子树,序列化字符串变成 1,2,。现在从节点 2 开始,我们访问它的左节点 3(1,2,3,none,none,)和右节点 4。
(1,2,3,None,None,4,None,None)。None,None, 是用来标记缺少左、右子节点,这就是我们在序列化期间保存树结构的方式。最后,我们回到根节点 1 并访问它的右子树,它恰好是叶节点 5。最后,序列化字符串是按 1,2,3,None,None,4,None,None,5,None,None,.
现在让我们反序列化 1,2,3,None,None,4,None,None,5,None,None, 字符串。它沿着字符串运行,初始化节点值,然后调用自身来构造其左、右子节点。
public String rserialize(TreeNode root,String str){if(root==null)str+="null,";else{str+=String.valueOf(root.val)+",";str=rserialize(root.left,str);str=rserialize(root.right,str);}return str;}public String serialize(TreeNode root){return rserialize(root,"");}public TreeNode deserialize(String data){String[] data_array = data.split(",");List<String> data_list = new LinkedList<>(Arrays.asList(data_array));return rdeserialize(data_list);}public TreeNode rdeserialize(List<String> l){if(l.get(0).equals("null")){l.remove(0);return null;}TreeNode root = new TreeNode(Integer.valueOf(l.get(0)));l.remove(0);root.left = rdeserialize(l);root.right = rdeserialize(l);return root;}
