1 序列化与反序列化
二叉树的序列化与反序列化
1.1 实现思路
- 方式一:前序遍历
- 通过前序遍历方式实现二叉树的序列化
- 将结果存入队列中
- 要注意空节点也要存null
- 方式二:层序遍历
- 层序遍历也是用队列实现
- 注意从左到右,遇到空节点存null
1.2 代码实现
/**
* 二叉树的序列化与反序列化
*
* @author wen
*/
public class SerializeAndReconstructTree {
public static class Node {
public int val;
public Node left;
public Node right;
public Node(int val) {
this.val = val;
}
}
/**
* 二叉树的序列化(前序遍历实现)
*
* @param head 头节点
* @return 返回一个队列
*/
public static Queue<String> preSerial(Node head) {
Queue<String> queue = new LinkedList<>();
pres(queue, head);
return queue;
}
private static void pres(Queue<String> queue, Node head) {
if (head == null) {
queue.add(null);
} else {
queue.add(String.valueOf(head.val));
pres(queue, head.left);
pres(queue, head.right);
}
}
/**
* 二叉树的反序列化(前序遍历实现)
*
* @param preQueue 存着二叉树序列化的队列
* @return 返回,反序列化的二叉树头节点
*/
public static Node buildByPreQueue(Queue<String> preQueue) {
if (preQueue == null || preQueue.isEmpty()) {
return null;
}
return preBuild(preQueue);
}
private static Node preBuild(Queue<String> preQueue) {
String val = preQueue.poll();
if (val == null) {
return null;
}
Node head = new Node(Integer.parseInt(val));
head.left = preBuild(preQueue);
head.right = preBuild(preQueue);
return head;
}
/**
* 二叉树序列化(层序遍历实现)
*
* @param head 二叉树头节点
* @return 返回序列化后的队列
*/
public static Queue<String> levelSerial(Node head) {
Queue<String> ans = new LinkedList<>();
if (head == null) {
ans.add(null);
} else {
ans.add(String.valueOf(head.val));
Queue<Node> help = new LinkedList<>();
help.add(head);
while (!help.isEmpty()) {
Node cur = help.poll();
if (cur.left != null) {
ans.add(String.valueOf(cur.left.val));
help.add(cur.left);
} else {
ans.add(null);
}
if (cur.right != null) {
ans.add(String.valueOf(cur.right.val));
help.add(cur.right);
} else {
ans.add(null);
}
}
}
return ans;
}
/**
* 反序列化(层序遍历实现)
*
* @param levelQueue 序列化存入的队列
* @return 返回,反序列化的二叉树头节点
*/
public static Node buildByLevelQueue(Queue<String> levelQueue) {
if (levelQueue == null || levelQueue.isEmpty()) {
return null;
}
Node head = generateNode(levelQueue.poll());
Queue<Node> queue = new LinkedList<>();
if (head != null) {
queue.add(head);
}
Node node = null;
while (!queue.isEmpty()) {
node = queue.poll();
node.left = generateNode(levelQueue.poll());
node.right = generateNode(levelQueue.poll());
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
return head;
}
private static Node generateNode(String val) {
if (val == null) {
return null;
}
return new Node(Integer.parseInt(val));
}
}