import java.util.Arrays;
import java.util.LinkedList;
public class TreeSerialization {
// 方法一:DFS,先序遍历
// 序列化方法
public String serialize(TreeNode root) {
// 定义一个StringBuffer来保存序列化结果
StringBuffer result = new StringBuffer();
result.append("[");
dfs_serialize(root, result);
result.deleteCharAt(result.length() - 1);
result.append("]");
return result.toString();
}
// 递归方法,实现深度优先搜索
public void dfs_serialize(TreeNode root, StringBuffer result) {
// 基准情况
if (root == null) {
result.append("null,");
return;
}
// 将当前根节点的值序列化添加到result
result.append(root.val + ",");
// 递归处理左右子树
dfs_serialize(root.left, result);
dfs_serialize(root.right, result);
}
// 反序列化
public TreeNode deserialize(String data){
// 首先将数据进行切分,得到每个节点的值,保存成一个链表
String[] dataArr = data.split(",");
LinkedList<String> dataList = new LinkedList<>(Arrays.asList(dataArr));
// 删掉方括号
String firstElement = dataList.getFirst().substring(1);
dataList.removeFirst();
dataList.addFirst(firstElement);
String lastElement = dataList.getLast().substring(0, dataList.getLast().length() - 1);
dataList.removeLast();
dataList.addLast(lastElement);
return dfs_deserialize(dataList);
}
// 实现递归方法,辅助反序列化
public TreeNode dfs_deserialize(LinkedList<String> dataList){
// 基准情况,遇到null,就是叶子节点的子节点,返回null
if (dataList.getFirst().equals("null")){
dataList.removeFirst();
return null;
}
// 获取当前节点
TreeNode node = new TreeNode(Integer.valueOf(dataList.getFirst()));
dataList.removeFirst(); // 处理完就删除
// 递归调用,定义当前节点的左右子节点
node.left = dfs_deserialize(dataList);
node.right = dfs_deserialize(dataList);
return node;
}
public static void main(String[] args) {
TreeNode node1 = new TreeNode(4);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(7);
TreeNode node4 = new TreeNode(1);
TreeNode node5 = new TreeNode(3);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(9);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node5;
node3.left = node6;
node3.right = node7;
TreeSerialization treeSerialization = new TreeSerialization();
System.out.println(treeSerialization.serialize(node1));
TreeNode newTree = treeSerialization.deserialize(treeSerialization.serialize(node1));
}
}