前言
抛开序列化的目的:将数据持久化存储到磁盘中
,我们以字符串的方式将二叉树结构打印出来,方便我们在处理二叉树相关问题的时候进行验证。
序列化
规则定义
现我们定义一套序列化规则,如下:
- 采用前序遍历方式,依次保存各个结点对应的值,中间以
_
进行分割; - 如果当前结点为null,则字符串拼接上
NULL
;
代码实现
private static class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
/**
* 使用前序遍历方式序列化Node
*
* @param node
* @return
*/
public static String serialByPreOrder(Node node) {
if (node == null) {
return "NULL_";
}
String res = node.value + "_";
res += serialByPreOrder(node.left);
res += serialByPreOrder(node.right);
return res;
}
反序列化
即将上述序列化得到的字符串结果还原成Node结构;
思路
- 先对字符串按照
_
进行分割得到字符数组; - 遍历字符数组,得到各个结点的值,依次存放到队列中【借助队列方便实现递归调用】;
- 从队列中依次取出值,如果为
NULL
,则返回null,否则构造对应的Node对象,递归处理;
代码实现
public static Node reconByPreOrderStr(String str) {
if (str == null || str.length() == 0) {
return null;
}
String[] array = str.split("_");
Queue<String> queue = new LinkedList<>();
for (int i = 0; i < array.length; i++) {
queue.add(array[i]);
}
return reconByQueue(queue);
}
private static Node reconByQueue(Queue<String> queue) {
String value = queue.poll();
if ("NULL".equals(value)) {
return null;
}
Node head = new Node(Integer.valueOf(value));
head.left = reconByQueue(queue);
head.right = reconByQueue(queue);
return head;
}
测试用例
public static void main(String[] args) {
Node node = new Node(1);
node.left = new Node(2);
node.right = new Node(3);
node.right.left = new Node(4);
node.right.right = new Node(5);
String serialResult = serialByPreOrder(node);
System.out.println("序列化结果:" + serialResult);
}
输出结果
序列化结果:1_2_NULL_NULL_3_4_NULL_NULL_5_NULL_NULL_
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )