序列化与反序列化二叉树
宽度优先
public class Solution {
// 序列化, 将二叉树转换为字符串
String Serialize(TreeNode root) {
if (root == null)
return "#,";
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
String seria = root.val + ",";
while (!queue.isEmpty()) {
root = queue.poll();
// 如果子节点不为空, 则加入队列并写入值
if (root.left != null) {
seria += root.left.val + ",";
queue.add(root.left);
} else {
// 为空时写入#
seria += "#,";
}
if (root.right != null) {
seria += root.right.val + ",";
queue.add(root.right);
} else {
seria += "#,";
}
}
return seria;
}
// 反序列化, 将字符串转换为二叉树结构
TreeNode Deserialize(String str) {
// 分割字符串
String[] nodes = str.split(",");
// 存放序列号值的队列
Queue<String> queue = new LinkedList<>(Arrays.asList(nodes));
// help队列, 队头为待设置子树的根节点
Queue<TreeNode> help = new LinkedList<>();
// 解析根结点
String first = queue.poll();
// 如果第一个字符为#则为空树
if(first.equals("#"))
return null;
// 创建节点并放入help队列
TreeNode root = new TreeNode(Integer.parseInt(first));
help.add(root);
while(!help.isEmpty()) {
// 从help队列获取待处理的根节点
TreeNode head = help.poll();
// 从队列获取一个值,如果不为#则为其创建子节点, 并将子节点入队, 否则子树为空
String left = queue.poll();
if(left.equals("#")) {
head.left = null;
} else {
head.left = new TreeNode(Integer.parseInt(left));
help.add(head.left);
}
String right = queue.poll();
if(right.equals("#")) {
head.right = null;
} else {
head.right = new TreeNode(Integer.parseInt(right));
help.add(head.right);
}
}
return root;
}
}
本文来自博客园,作者:brbrbr,转载请注明原文链接:https://www.cnblogs.com/brbrbr/p/15881480.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具