剑指offer 50. 序列化二叉树-java
Acwing 50. 序列化二叉树
原题链接
请实现两个函数,分别用来序列化和反序列化二叉树。
您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。
数据范围
树中节点数量 [0,1000]。
代码案例:
前序遍历也可以 不局限于层序遍历
题解
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// import java.util.*;
int u = 0 ;
StringBuilder res = new StringBuilder();
// Encodes a tree to a single string.
String serialize(TreeNode root) {
dfs(root,res);
return res.toString() ;
}
void dfs(TreeNode root,StringBuilder res){
if(root == null) {
res.append("null,");
return ;
}
res.append(root.val) ;
res.append(',') ;
dfs(root.left,res);
dfs(root.right,res);
// System.out.println(res);
}
// Decodes your encoded data to tree.
TreeNode deserialize(String s) {
return dfs_d(s);
}
TreeNode dfs_d(String s ){
if(u == s.length()) return null; //如果已经达到了字符串的尾端,则退出。
int k = u ;
while (s.charAt(k) != ',') k ++ ;
if(s.charAt(u) == 'n'){//如果当前字符串是“null”
u = k + 1 ;//回到下一个数字的首部,注意是u = k+1, 不是u = u+1;
return null;
}
int val = 0 ;
int sign = 1;
if (u < k && s.charAt(u) == '-') {
sign = -1; u ++ ;//如果是负数 则下一位
}
for (int i = u; i < k; i ++ ) val = val * 10 + s.charAt(i) - '0';//把字符串转化为数字
val = val*sign;
u = k + 1;//回到下个数字的首部
//递归算法总是先写退出条件,然后才递归调用。
TreeNode root = new TreeNode(val);
root.left = dfs_d(s);
root.right = dfs_d(s);
return root;
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int index = -1;
// Encodes a tree to a single string.
String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
if(root==null) {
sb.append("null,");
return sb.toString();
}
sb.append(root.val).append(",");
sb.append(serialize(root.left));
sb.append(serialize(root.right));
return sb.toString();
}
// Decodes your encoded data to tree.
TreeNode deserialize(String data) {
index++;
String[] nodes = data.split(",");
TreeNode node = null;
if(!nodes[index].equals("null")){
node = new TreeNode(Integer.valueOf(nodes[index]));
node.left = deserialize(data);
node.right = deserialize(data);
}
return node;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)