[leetcode/lintcode 题解]大厂算法面试高频题: 序列化和反序列N叉树

简介: [leetcode/lintcode 题解]大厂算法面试高频题: 序列化和反序列N叉树

描述
序列化是将一个数据结构或对象转换成比特流的过程,以便将其存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一或另一计算机环境中重建。
设计一个算法来序列化和反序列化一个N叉树。一棵N叉树是一棵有根树,其中每个节点的子节点不超过N个。序列化/反序列化算法的实现方式没有限制。您只需要确保N叉树可以序列化为字符串,并且该字符串可以反序列化为原始树结构。
例如,你可以序列化如下的3叉树

为 [1 [3[5 6] 2 4]]。你不一定要遵循这种格式,发挥创意,自己想出不同的方法。
图模型说明: https://www.lintcode.com/help/graph

image.png

在线评测地址:领扣题库官网

样例1
输入:{1,3,2,4#2#3,5,6#4#5#6}
输出:{1,3,2,4#2#3,5,6#4#5#6}
解释:如上图
样例2
输入:{1,3,2#2#3}
输出:{1,3,2#2#3}
解释:
          1
         / \
        3   2

解题思路
题解:基本是dfs分治即可解决,对输入的有向图从1节点开始遍历构造字符串,遍历儿子节点前加入左括号,完成后加入右括号。还原N叉树同样,遇到左括号开始搜索,读取数字存入,遇到右括号退出。

源代码

/**
 * Definition for Directed graph.
 * class DirectedGraphNode {
 *     int label;
 *     ArrayList<DirectedGraphNode> neighbors;
 *     DirectedGraphNode(int x) { label = x; neighbors = new ArrayList<DirectedGraphNode>(); }
 * };
 */

public class Solution {
    public int pos = 1;
    public String dfs(DirectedGraphNode root) {
        String ans="";
        if(root == null)
            return ans;
        ans += "[";
        ans += String.valueOf(root.label);
        for(int i = 0; i < root.neighbors.size() ; i++) {
                ans += dfs(root.neighbors.get(i));
        }
        ans += "]";
        return ans;
        
    }
    public UndirectedGraphNode solve(String data) {
        int num = 0;
            while(data.charAt(pos) >= '0' && data.charAt(pos) <= '9') {
                num *= 10;
                num += data.charAt(pos) - '0';
                pos++;
            }
            UndirectedGraphNode node =  new UndirectedGraphNode(num);
            while(pos < data.length()) {
                if(data.charAt(pos) == '[' ) {
                    ++pos;
                    node.neighbors.add(solve(data));
                }
                else if(data.charAt(pos) == ']') {
                    pos++;
                    return node;
                }
            }
        return null;
    }
    public String serialize(ArrayList<DirectedGraphNode> nodes) {
        String ans="";
        if(nodes.size() == 0)
            return ans;
        return dfs(nodes.get(0));
    }
    public UndirectedGraphNode deserialize(String data) {
       if(data.length() == 0)
            return null;
        return solve(data);
    }
}

更多题解参考:九章官网solution

相关文章
|
7月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
9天前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
33 3
 算法系列之数据结构-Huffman树
|
7月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
157 1
|
2月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
62 2
|
3月前
|
JSON 算法 Java
Nettyの网络聊天室&扩展序列化算法
通过本文的介绍,我们详细讲解了如何使用Netty构建一个简单的网络聊天室,并扩展序列化算法以提高数据传输效率。Netty的高性能和灵活性使其成为实现各种网络应用的理想选择。希望本文能帮助您更好地理解和使用Netty进行网络编程。
56 12
|
4月前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
72 2
|
5月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
48 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
6月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
102 2
|
5月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
54 0