【BFS】LeetCode 297. 二叉树的序列化与反序列化
题目链接
思路
使用BFS的方法进行序列化及反序列化
序列化
运用BFS遍历树的所有结点,不论是否为null
都放进队列中。
- 如果结点不为
null
,则把结点数据转为字符串放入结果字符串中。 - 如果结点为
null
,则把"X"
放入结果字符串中。
所有结点都以 ","
作为分隔。
注意:此处队列需要使用能存放 null
值的数据结构进行实例化。
反序列化
与序列化相似,建立新结点 root
,将 root
放入队列,循环中每次取队头结点 node
,依据序列字符串不断地修改 node.left
和 node.right
。
- 如果字符串为
"X"
则跳过修改对应的node.left
或node.right
。 - 如果字符串不为
"X"
则将新结点建立。
注意: while
循环中要修改 node
的成员,而不要修改 node
本身,因为 root
初值为 null
,这样在取队头结点的时候是传的值而不是引用。对 node
的修改没法传到 root
。
代码
class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root == null){
return "";
}
StringBuilder sb = new StringBuilder();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
if(node == null){
sb.append("X,");
}else{
sb.append(node.val + ",");
queue.offer(node.left);
queue.offer(node.right);
}
}
return sb.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(Objects.equals(data, "")){
return null;
}
Queue<String> nodes = new ArrayDeque<>(Arrays.asList(data.split(",")));
TreeNode root = new TreeNode(Integer.parseInt(nodes.poll()));
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
String left = nodes.poll();
String right = nodes.poll();
if(!left.equals("X")){
node.left = new TreeNode(Integer.parseInt(left));
queue.add(node.left);
}
if(!right.equals("X")){
node.right = new TreeNode(Integer.parseInt(right));
queue.add(node.right);
}
}
return root;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」