题目:
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
示例1
输入:{8,6,10,5,7,9,11}
返回值:{8,6,10,5,7,9,11}
思路:
- 题目简单来说就是用字符串和二叉树之间的互相转换,需要注意的是结点结束需要以 “!” 结尾
- 二叉树转字符串其实几种遍历方式都可以,
- 但是考虑到字符串转二叉树的时候,先序遍历其索引值更有规律(根左右,三个字符就是一组递归涉及的结点,且符合先建立根节点,再建立其左右子树的逻辑)
- 这里我们基于先序遍历的递归实现来还原过程
代码:
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
String Serialize(TreeNode root) {
if(root==null) return "#!";
StringBuilder serStr = new StringBuilder();
bfs(root, serStr);
return serStr.toString();
}
private void bfs(TreeNode root, StringBuilder serStr){
if(root==null) {
serStr.append("#!");
return;
}
serStr.append(root.val).append("!");
bfs(root.left, serStr);
bfs(root.right, serStr);
}
TreeNode Deserialize(String str) {
if(str==null || "".equals(str)) return null;
// 拆分后就是单个结点组成的数组
String[] strs = str.split("!");
return bfsNode(strs);
}
// 如果需要多次使用反序列化,index要重置处理,或者生成多个类
private int index=-1;
private TreeNode bfsNode(String[] strs){
// 字符索引递增
index++;
if("#".equals(strs[index])) return null;
TreeNode root = new TreeNode(Integer.parseInt(strs[index]));
root.left = bfsNode(strs);
root.right = bfsNode(strs);
return root;
}
}