【题目】
二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建二叉树的过程叫做二叉树的反序列化,给定一颗二叉树的头节点head,已知二叉树节点值的类型为32位整型。请设计一种二叉树序列化和反序列化方案,并用代码实现。
【解答】
package zcy;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
// 通过先序遍历实现序列化和反序列化
public class P107_NodeSerial {
public static void main(String[] args) {
Node node = new Node(12);
node.left = new Node(3);
node.right = new Node(5);
String s = nodeSerialToStr(node);
System.out.println(s);
Node node1 = strToNode(s);
preOrder(node1);
}
/**
* 树序列化
*
* @param head
* @return
*/
public static String nodeSerialToStr(Node head) {
if (head == null) {
return "#!";
}
String res = head.value + "!";
res += nodeSerialToStr(head.left);
res += nodeSerialToStr(head.right);
return res;
}
public static Node strToNode(String str) {
String[] strs = str.split("!");
Queue<String> queue = new LinkedList();
for (String s : strs) {
queue.add(s);
}
return serialToNode(queue);
}
/**
* 字符串反序列化成树
*
* @param queue
* @return
*/
public static Node serialToNode(Queue<String> queue) {
String s = queue.poll();
if ("#".equals(s)) {
return null;
}
Node node = new Node(Integer.parseInt(s));
node.left = serialToNode(queue);
node.right = serialToNode(queue);
return node;
}
/**
* 先序遍历
*
* @param node
*/
public static void preOrder(Node node) {
if (null == node) {
return;
}
Stack<Node> s1 = new Stack<Node>();
s1.add(node);
while (!s1.isEmpty()) {
Node cur = s1.pop();
System.out.println(cur.value);
if (cur.right != null) {
s1.push(cur.right);
}
if (cur.left != null) {
s1.push(cur.left);
}
}
}
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
}