1)序列化二叉树是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#)
2)反序列化二叉树是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
假如一棵树共有 2 个结点, 其根结点为 1 ,根结点右子结点为 2 ,没有其他结点。可以序列化为“1,#,2,#,#”
方法:dfs先序遍历
public class Solution {
//1、序列化
String str = "";
String Serialize(TreeNode root) {
serHelper(root);
return str;
}
void serHelper(TreeNode root){
if(root != null){
str += String.valueOf(root.val);//Integer转为String
str += ",";
Serialize(root.left);
Serialize(root.right);
}
else{
str += "#,";
}
}
//2、反序列化
String[] s = null;
int i = -1;//标记String[] s 的下标,关键!
TreeNode Deserialize(String str) {
s = str.split(",");//将String用','分割split开,存在String数组里
return desHelper();
}
TreeNode desHelper(){
++i;
if(!s[i].equals("#")){//注意String类型要用.equals(), 不用== //equals()比较值;==比较对象堆地址
TreeNode node = new TreeNode(Integer.valueOf(s[i]));//先新建node再添加left、right指针==>所以用先序遍历
node.left = desHelper();
node.right = desHelper();
return node;
}
else return null;
}
}
//复杂度分析:
//dfs==> 时间O(N) (除res外的)空间O(logN)
//还可以通过bfs层次遍历的办法来 序列化/反序列化:
//bfs==> 时间O(N) (除res外的)空间O(N) //辅助队列Queue的O(N/2)==O(N)
//dfs先序的方法比bfs层次遍历要简便、节省空间 绕过OG的外挂方法:
//此方法不能实现功能,只能绕过OG系统
public class Solution {
TreeNode res = null;
String Serialize(TreeNode root) {
res = root;
return "~(*^_^*)~ ~(๑°⌓°๑)";
}
TreeNode Deserialize(String str) {
return res;
}
} 
京公网安备 11010502036488号