image.png

解决思路

深度优先搜索

image.png
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, 字符串。它沿着字符串运行,初始化节点值,然后调用自身来构造其左、右子节点。

  1. public String rserialize(TreeNode root,String str){
  2. if(root==null)
  3. str+="null,";
  4. else{
  5. str+=String.valueOf(root.val)+",";
  6. str=rserialize(root.left,str);
  7. str=rserialize(root.right,str);
  8. }
  9. return str;
  10. }
  11. public String serialize(TreeNode root){
  12. return rserialize(root,"");
  13. }
  14. public TreeNode deserialize(String data){
  15. String[] data_array = data.split(",");
  16. List<String> data_list = new LinkedList<>(Arrays.asList(data_array));
  17. return rdeserialize(data_list);
  18. }
  19. public TreeNode rdeserialize(List<String> l){
  20. if(l.get(0).equals("null")){
  21. l.remove(0);
  22. return null;
  23. }
  24. TreeNode root = new TreeNode(Integer.valueOf(l.get(0)));
  25. l.remove(0);
  26. root.left = rdeserialize(l);
  27. root.right = rdeserialize(l);
  28. return root;
  29. }