二叉树序列化和反序列化
程序员文章站
2022-06-05 09:14:06
...
二叉树序列化和反序列化
二叉树的序列化和反序列其实很简单。序列化可以暴力的理解为将一颗形象的树型结构压扁成链型结构,这个链型结构可以想象成一列火车,这列火车可以用队列表示,里面每节车厢存储了二叉树的各个节点值和辅助信息(方便反序列); 反序列就是将火车车厢里的东西倒出来,根据其进入车厢的顺序,将节点值和辅助信息有序的排列起来,还原成原来的二叉树。
eg:
该二叉树序列化可表示为:
具体代码实现
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
//第一个辅助信息,他的本质就是如果一个节点没有哪个子节点(左节点或右节点),
//这个子节点就用这个辅助信息表示,即占个坑,防止1_12和1_1_2的情况出现
if(root == null){
return "#_";
}
//如果该节点的值不为空,则用“_”连接下一个节点信息,res可以理解为火车
String res = root.val + "_";
//采用递归将所有节点信息装进火车
res += serialize(root.left);
res += serialize(root.right);
return res;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data!=null){
//首先用“_”对所有字符串进行分割,得到字符串数组
String[] value = data.split("_");
if(value.length>0){
Queue<String> list = new LinkedList<>();
//遍历数组
for(int i = 0;i!=value.length;i++){
//将数组内容压入队列中
list.offer(value[i]);
}
return reconPreOrder(list);
}
}
return null;
}
public TreeNode reconPreOrder(Queue<String> list){
//从队列中弹出所有数组内容
String value = list.poll();
//如果是“#”代表他的节点值为空
if(value.equals("#")){
return null;
}
//将字符串转为整形,并把它建成树
Node head = new Node(Integer.valueOf(value));
head.left = reconPreOrder(list);
head.right = reconPreOrder(list);
return head;
}
}