38.序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。
数据范围:
树中节点数量 [0,1000]。
样例:
你可以序列化如下的二叉树
为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"
注意:
- 以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//序列化二叉树(前序遍历方式)
// Encodes a tree to a single string.
String serialize(TreeNode root) {
//如果当前节点为空,返回"null,"表示空节点
if(root == null)return "null,";
//前序遍历:先处理当前节点,然后左子树,最后右子树
String s = root.val+",";
//递归序列化左子树
s += serialize(root.left);
//递归序列化右子树
s += serialize(root.right);
//返回序列化结果
return s;
}
//反序列化字符串为二叉树
// Decodes your encoded data to tree.
TreeNode deserialize(String data) {
//将序列化字符串按逗号分割成数组
String[] s = data.split(",");
//使用队列存储节点值
Queue<String>queue = new LinkedList<>();
//将分割后的字符串数组存入队列
for(String s1:s)queue.add(s1);
//调用辅助方法构建二叉树
return buildTree(queue);
}
// 辅助方法:根据队列构建二叉树
private TreeNode buildTree(Queue<String> queue) {
//取出队列第一个元素
String s = queue.poll();
//如果是"null",表示空节点
if(s.equals("null"))return null;
//创建当前节点(将字符串转换为整数)
TreeNode root = new TreeNode(Integer.parseInt(s));
//递归构建左子树
root.left = buildTree(queue);
//递归构建右子树
root.right = buildTree(queue);
//返回当前构建好的节点
return root;
}
}


浙公网安备 33010602011771号