package code03.二叉树_02;
import java.util.LinkedList;
import java.util.Queue;
/**
* https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/
*
* 二叉树按层序列化 与 反序列化
*
*/
public class Code01_SerializeAndReconstructTree
static class TreeNode
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) val = x;
public static final String SEPARATOR = ",";
public String serialize(TreeNode root)
//边界值判断
if (root == null)
return "";
//逐层搜集,首先收集根节点,并存入队列。印证思路第1步
StringBuffer sb = new StringBuffer();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
sb.append(root.val);
while (!queue.isEmpty())
TreeNode node = queue.poll();
if (node.left != null)
queue.add(node.left);
sb.append(SEPARATOR).append(node.left.val);
else
sb.append(SEPARATOR).append("null");
if (node.right != null)
queue.add(node.right);
sb.append(SEPARATOR).append(node.right.val);
else
sb.append(SEPARATOR).append("null");
return sb.toString();
public TreeNode generateNode (String str)
if ("null".equals(str))
return null;
return new TreeNode(Integer.valueOf(str));
public TreeNode deserialize(String data)
if (data == null || data.isEmpty())
return null;
Queue<String> queue = new LinkedList<>();
String[] arr = data.split(SEPARATOR);
for (int i = 0; i < arr.length; i++)
queue.add(arr[i]);
Queue<TreeNode> queueNode = new LinkedList<>();
TreeNode node = generateNode(queue.poll());
queueNode.add(node);
TreeNode cur = null;
while (!queueNode.isEmpty())
cur = queueNode.poll();
if (cur != null)
cur.left = generateNode(queue.poll());
cur.right = generateNode(queue.poll());
queueNode.add(cur.left);
queueNode.add(cur.right);
return node;
public static void main(String[] args)
TreeNode tree = new TreeNode(1);
tree.left = new TreeNode(2);
tree.right = new TreeNode(3);
tree.left.left = new TreeNode(4);
tree.right.right = new TreeNode(5);
tree.left.left.left = new TreeNode(6);
Code01_SerializeAndReconstructTree test = new Code01_SerializeAndReconstructTree();
String str = test.serialize(tree);
System.out.println(str);
TreeNode node = test.deserialize(str);
System.out.println("===========测试完毕,debug查看node================");