题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,
从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的
二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),
以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
思路:
算法思想:根据前序遍历规则完成序列化与反序列化。
依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的,比较容易理解和操作。
反序列化是重点:也是根据前序遍历来实现,有点技巧,好好体会
public class Solution {
String Serialize(TreeNode root) {
if (root == null) {
return "#!";
}
StringBuilder sb = new StringBuilder();
//前序遍历的改造
sb.append(root.val + "!");//当前结点值加入sb
sb.append(Serialize(root.left));//一直递归将左子树加入sb
sb.append(Serialize(root.right));//一直递归将左子树加入sb
return sb.toString();
}
TreeNode Deserialize(String str) {
if (str == null || str.length() == 0)
return null;
//将str去"!"变为数组再操作,否则每次都要split("!")
return Deserialize(str.split("!"));
}
int index = -1;
TreeNode Deserialize(String[] strArr) {
index++;//每次进来,index往后移动处理下一个结点
TreeNode node = null;
//注意这里不能用!=否则发生错误,建议比较字符串内容都用equals
if (!strArr[index].equals("#")) {
node = new TreeNode(Integer.valueOf(strArr[index]));//取出当前结点
//不断递归按前序遍历的顺序将左右结点连接
node.left = Deserialize(strArr);
//为#时会停止递归,处理当前结点的右结点
node.right = Deserialize(strArr);
}
return node;
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}