题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
思路:
- 首先其实跟层次遍历类似,只是遍历的过程我们需要把值加入到StringBuilder中
- 在加完值之后要立即追加一个!(这里我用,代替)递归遍历就好了
- 解码利用str.spilt分割出来数组,只要没遇到#说明就还有子节点
- 第一个数组头绝对是根节点,然后递归加入左右子节点
/*
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) {
StringBuilder str=new StringBuilder();
if(root==null) return "";
Serialize2(root, sb);
return sb.toString();
}
//序列化
void Serialize2(TreeNode root, StringBuilder sb) {
if(root == null) { //如果节点为空就加一个#逗号是为了分隔
sb.append("#,");
return;
}
sb.append(root.val); //添加值
sb.append(','); //然后以,分割
Serialize2(root.left, sb); //递归左右子节点
Serialize2(root.right, sb);
}
int index = -1; //标志位
//解码,分割数组
TreeNode Deserialize(String str) {
if(str.length() == 0)
return null;
String[] strs = str.split(",");
return Deserialize2(strs);
}
//解码
TreeNode Deserialize(String str) {
index++;
if(!strs[index].equals("#")) {
TreeNode root = new TreeNode(0);
root.val = Integer.parseInt(strs[index]);
root.left = Deserialize2(strs);
root.right = Deserialize2(strs);
return root;
}
return null;
}
}