问题描述:
如何编写一个算法以实现二叉树的序列化和反序列化?
- 将树写入一个文件被称为“序列化”。
- 读取文件后重建同样的二叉树被称为“反序列化”。
重点:
在执行序列化及反序列化时,Node节点为空需要转化输出为#
输入:{3,9,20,#,#,15,7}
输出:{3,9,20,#,#,15,7}
解释:
二叉树 {3,9,20,#,#,15,7},表示如下的树结构:
3
/ \
9 20
/ \
15 7
它将被序列化为 {3,9,20,#,#,15,7}
主要考点:
二叉树序列化为及反序列化的逻辑算法
算法逻辑:
- 序列化:
- 判断获取的TreeNode节点是否存在(非空)
- 获取并判断TreeNode的子节点是否存在
- 若存在则将正确的节点数据组装并重复步骤2,下钻获取子节点直至子节点为空
- 若不存在则将#看作占位符置入序列化字符串中返回空并中止当前的子节点下钻
- 反序列化:
- 声明反序列化变量now = 0(可理解为目前二叉树的层级,默认从根节点开始向下延展)
- 将序列化的字符串转化为Array数组
- 循环判断Array数组中的值是否存在(#为空节点)
- 若值为#,则返回空并中止当前子节点继续下钻。
- 若值不为#,则实例化TreeNode并构建对应的二叉树结构。
- 重复步骤3,4,5构建TreeNode子节点,直至没有下级子节点。
代码实现:
public String serialize(TreeNode root) {
return doSerialize(root);
}
private String doSerialize(TreeNode root){
if(root == null)
return "#";
String left = doSerialize(root.left);
String right = doSerialize(root.right);
return String.valueOf(root.val) + "," + left + "," + right;
}
int now;
public TreeNode deserialize(String data) {
now = 0;
return doDeserialize(data.split(","));
}
private TreeNode doDeserialize(String[] array){
if(array[now].equals("#")){
now++;
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(array[now]));
now++;
root.left = doDeserialize(array);
root.right = doDeserialize(array);
return root;
}