二叉树的序列化和反序列化
二叉树被记录成文件的过程叫做二叉树的序列号。通过文件内容重建原来二叉树的过程叫做二叉树的反序列号。
给定一个二叉树头节点head,并已知二叉树节点值的类型为32位整型。设计一种二叉树序列化,和反序列化方案,并且代码实现。
方法一,先序遍历下的序列化过程,首先假设徐立华的结果字符串为str,初始str=“”, 先序遍历二叉树,如果遇到null节点,就在str末尾加上“#” 节点不存在,“!”表示一个值的结束。如果遇到不为空的节点,假设节点值为3,就在str的末尾加上 3!。
package TT;
public class Test200 {
public class Node{
public int value;
public Node left;
public Node right;
public Node(int data){
this.value=data;
}
}
public String serialByPre(Node head){
if(head==null){
return "#!";
}
String res = head.value+"!";
res += serialByPre(head.left);
res += serialByPre(head.right);
return res;
}
}
接下来,通过先序遍历序列化的结果字符串str,重构二叉树的过程,反序列化。
方法二、通过层遍历实现序列化和反序列化
初始时 str=“空” 然后实现二叉树的按层遍历,具体方式是利用队列结构,也就是宽度遍历图的常见方式。
package TT;
import java.util.LinkedList;
import java.util.Queue;
public class Test200 {
public class Node{
public int value;
public Node left;
public Node right;
public Node(int data){
this.value=data;
}
}
public String serialBylevel(Node head){
if(head == null){
return "#!";
}
String res = head.value+"!";
Queue<Node> queue = new LinkedList<Node>();
queue.offer(head);
while(!queue.isEmpty()){
head=queue.poll();
if(head.left != null){
res+=head.left.value+"!";
queue.offer(head.left);
}else {
res+="#!";
}
if(head.right != null){
res+=head.right.value+"!";
queue.offer(head.right);
}else {
res+="#!";
}
}
return res;
}
}
先序遍历的反序列化其实就是重做先序遍历,遇到“#”就生成null节点,结束生成后续子树的过程
package TT;
import java.util.LinkedList;
import java.util.Queue;
public class Test200 {
public class Node{
public int value;
public Node left;
public Node right;
public Node(int data){
this.value=data;
}
}
public String serialBylevel(Node head){
if(head == null){
return "#!";
}
String res = head.value+"!";
Queue<Node> queue = new LinkedList<Node>();
queue.offer(head);
while(!queue.isEmpty()){
head=queue.poll();
if(head.left != null){
res+=head.left.value+"!";
queue.offer(head.left);
}else {
res+="#!";
}
if(head.right != null){
res+=head.right.value+"!";
queue.offer(head.right);
}else {
res+="#!";
}
}
return res;
}
public Node reconByLevelString(String levelStr){
String[] values = levelStr.split("!");
int index = 0;
Node head = generateNodeByString(values[index++]);
Queue<Node> queue = new LinkedList<Node>();
if(head != null){
queue.offer(head);
}
Node node = null;
while(!queue.isEmpty()){
node = queue.poll();
node.left = generateNodeByString(values[index++]);
node.right = generateNodeByString(values[index++]);
if(node.left !=null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
return head;
}
public Node generateNodeByString(String val){
if(val.equals("#")){
return null;
}
return new Node(Integer.valueOf(val));
}
}