二叉树的序列化与反序列化
前言
二叉树的序列化是指将二叉树转化成一个字符串,便于存储或者通过网络传输。反序列化就是将字符串通过相同的规则转化成二叉树。
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
序列化
通过先序遍历存储每个节点,和普通的先序遍历不同的是,需要存储空节点。
序列化的结果如下:
"1,2,#,4,#,#,3,#,#,"
反序列化
一般情况下,不能只通过先序遍历构造出二叉树,而需要先序遍历和中序遍历才能构造二叉树。但是这里情况不一样,因为字符串中包含了空节点,所以可以只通过先序遍历构造出二叉树。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
String SEP = ",";
String NULL = "#";
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
traverse(root, sb);
return sb.toString();
}
void traverse(TreeNode root, StringBuilder sb){
if(root == null){
sb.append(NULL).append(SEP);
return;
}
sb.append(root.val).append(SEP);
traverse(root.left, sb);
traverse(root.right, sb);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
LinkedList<String> node = new LinkedList<>();
for(String str : data.split(SEP)){
node.add(str);
}
return build(node);
}
TreeNode build(LinkedList<String> node){
if(node.isEmpty()){
return null;
}
String rootVal = node.removeFirst();
if(rootVal.equals(NULL)){
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(rootVal));
root.left = build(node);
root.right = build(node);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探