請實現兩個函數,分別用來序列化和反序列化二叉樹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; }