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; } }