import java.util.LinkedList;
import java.util.Queue;
/**
* Created by lxw, liwei4939@126.com on 2017/10/30.
* 二叉树的序列化和反序列化
* 序列化可以基于先序、中序、后序、按层 的二叉树遍历方式来进行修改
*/
public class SerBinaryTree {
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;
}
public Node reconByPreString(String preStr){
String[] values = preStr.split("!");
Queue<String> queue = new LinkedList<String>();
for (int i=0; i< values.length; i++){
queue.offer(values[i]);
}
return reconPreOrder(queue);
}
public Node reconPreOrder(Queue<String> queue){
String value = queue.poll();
if(value.equals("#")){
return null;
}
Node head = new Node(Integer.valueOf(value));
head.left = reconPreOrder(queue);
head.right = reconPreOrder(queue);
return head;
}
//通过层遍历实现序列化和反序列化
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));
}
}
二叉树的序列化和反序列化
最新推荐文章于 2024-07-18 18:08:02 发布