题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过
某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
分析
通过前序遍历生成序列化的字符串,结点val+结束符!,碰到空结点则#!表示。
反序列化时,根据前序遍历的字符串顺序依次重建树。
如:
1 2 3 4 5 6
序列化后为:1!2!#!4!#!#!3!5!#!#!6!#!#!
代码
public class Solution {
int index = -1;
String Serialize(TreeNode root) {
if(root==null) return "";
StringBuilder sb = new StringBuilder();
TreeNode cur = root;
while(cur!=null || !stack.isEmpty()){
while(cur!=null){
stack.push(cur);
sb.append(cur.val).append("!");
cur=cur.left;
}
sb.append("#!");
if(!stack.isEmpty()){
cur = stack.pop();
cur = cur.right;
}
}
sb.append("#!");
return sb.toString();
}
TreeNode Deserialize(String str) {
if(str.length()==0) return null;
String[] strs = str.split("!");
index++;
if(index>=strs.length) return null;
TreeNode node = null;
if(!strs[index].equals("#")) {
node = new TreeNode(Integer.parseInt(strs[index]));
node.left = Deserialize(str);
node.right = Deserialize(str);
}
return node;
}
}