• 力扣 428. 序列化和反序列化 N 叉树 DFS


    428. 序列化和反序列化 N 叉树

    序列化是指将一个数据结构转化为位序列的过程,因此可以将其存储在文件中或内存缓冲区中,以便稍后在相同或不同的计算机环境中恢复结构。

    设计一个序列化和反序列化 N 叉树的算法。一个 N 叉树是指每个节点都有不超过 N 个孩子节点的有根树。序列化 / 反序列化算法的算法实现没有限制。你只需要保证 N 叉树可以被序列化为一个字符串并且该字符串可以被反序列化成原树结构即可。

    例如,你需要序列化下面的 3-叉 树。

    为 [1 [3[5 6] 2 4]]。你不需要以这种形式完成,你可以自己创造和实现不同的方法。

    或者,您可以遵循 LeetCode 的层序遍历序列化格式,其中每组孩子节点由空值分隔。

    例如,上面的树可以序列化为 [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]

    你不一定要遵循以上建议的格式,有很多不同的格式,所以请发挥创造力,想出不同的方法来完成本题。

    示例 1:

    输入: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
    输出: [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
    

    示例 2:

    输入: root = [1,null,3,2,4,null,5,6]
    输出: [1,null,3,2,4,null,5,6]
    

    示例 3:

    输入: root = []
    输出: []
    

    提示:

    • 树中节点数目的范围是 [0, 104].
    • 0 <= Node.val <= 104
    • N 叉树的高度小于等于 1000
    • 不要使用类成员 / 全局变量 / 静态变量来存储状态。你的序列化和反序列化算法应是无状态的。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/serialize-and-deserialize-n-ary-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

      

    做题结果

    成功,DFS直接过

    方法:DFS

    我的序列号格式 是 根(子)(子)(子),用的括号,先母后子即可

    序列化:根+(+递归子树序列化+)

    反序列化:

    1. 解析第一个左括号前的部分,作为根节点

    2. 使用栈来处理括号对,栈记录左括号的位置,当遇到右括号时,弹出栈,如果栈空,说明最后一个弹出的括号在最外层

    3. 递归解析内层子节点,加入父节点

    1. /*
    2. // Definition for a Node.
    3. class Node {
    4. public int val;
    5. public List<Node> children;
    6. public Node() {}
    7. public Node(int _val) {
    8. val = _val;
    9. }
    10. public Node(int _val, List<Node> _children) {
    11. val = _val;
    12. children = _children;
    13. }
    14. };
    15. */
    16. class Codec {
    17. // Encodes a tree to a single string.
    18. public String serialize(Node root) {
    19. if(root == null) return "";
    20. StringBuilder sb = new StringBuilder();
    21. sb.append(root.val);
    22. if(root.children!=null){
    23. for(Node child:root.children){
    24. sb.append("(");
    25. sb.append(serialize(child));
    26. sb.append(")");
    27. }
    28. }
    29. return sb.toString();
    30. }
    31. // Decodes your encoded data to tree.
    32. public Node deserialize(String data) {
    33. if(data.isEmpty()) return null;
    34. if(!data.contains("(")){
    35. Node d = new Node(Integer.parseInt(data));
    36. d.children = new ArrayList<>();
    37. return d;
    38. }
    39. Node root = new Node(Integer.parseInt(data.substring(0,data.indexOf("("))));
    40. root.children = new ArrayList<>();
    41. Stack<Integer> stack = new Stack<>();
    42. int n = data.length();
    43. for(int i = 0; i < n; i++){
    44. if(data.charAt(i)=='('){
    45. stack.push(i);
    46. }else if(data.charAt(i)==')'){
    47. int last = stack.pop();
    48. if(stack.isEmpty()){
    49. String part = data.substring(last+1,i);
    50. root.children.add(deserialize(part));
    51. }
    52. }
    53. }
    54. return root;
    55. }
    56. }
    57. // Your Codec object will be instantiated and called as such:
    58. // Codec codec = new Codec();
    59. // codec.deserialize(codec.serialize(root));

  • 相关阅读:
    大龄程序员的一周#3:差点“零成长”
    【栈的应用】数据结构之栈的几种常见题目(数制转换、括号匹配、汉诺塔、迷宫求解)
    代码运行过程中非语法问题的解决
    Javascript方法call、apply、bind的解析与实现
    CentOs/Ubuntu 一行指令安装Docker
    MongoDB脑裂恢复
    Spring详解及具体使用
    Linux21 --- 计算机网络基础概论(网络基本概念、网络分层模型、网络应用程序通信流程)
    一文搞定Linux的定时器(19)
    基于SSM+MySQL的校园共享单车管理系统
  • 原文地址:https://blog.csdn.net/yu_duan_hun/article/details/125529721