请实现两个函数,分别用来序列化和反序列化二叉树html
/* 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) { } TreeNode Deserialize(String str) { } }
首先咱们先来了解一下什么是二叉树的序列化和反序列化java
二叉树的序列化:将二叉树保存在一个文件或者数组中,可以持久化的存储node
二叉树的反序列化:从文件或者数组中取出数据,重构一颗二叉树数组
那么如何实现二叉树的序列化呢?咱们知道二叉树有三种深度优先遍历方式:前序遍历、中序遍历、后序遍历app
那么这三种遍历方式均可以实现将二叉树的序列化函数
那么接下来咱们选择基于前序遍从来实现二叉树的序列化this
咱们用‘$’表示空节点spa
String Serialize(TreeNode root) { StringBuffer stringBuffer = new StringBuffer(); SerializeSub(root, stringBuffer); return stringBuffer.toString(); } public void SerializeSub(TreeNode root, StringBuffer stringBuffer) { //当遇到空节点的时候,标记为$,再也不继续递归遍历 if(root == null) { stringBuffer.append("$,"); }else { //按照前序遍历的顺序,依次添加节点的val到stringbuffer(root->left->right) stringBuffer.append(root.val + ","); SerializeSub(root.left, stringBuffer); SerializeSub(root.right, stringBuffer); } }
因为咱们采用的是前序遍历序列化,那么一样反序列化也采用前序遍历反序列化code
前序遍历反序列化递归重建过程以下htm
int index = -1; TreeNode Deserialize(String str) { String[] arr = str.split(","); TreeNode node = null; index++; if(!arr[index].equals("$")) { node = new TreeNode(Integer.valueOf(arr[index])); node.left = Deserialize(str); node.right = Deserialize(str); } return node; }