題目
序列化是將一個數據結構或者對象轉換為連續的比特位的操作,進而可以將轉換后的數據存儲在一個文件或者內存中,同時也可以通過網絡傳輸到另一個計算機環境,采取相反方式重構得到原數據。
請設計一個算法來實現二叉樹的序列化與反序列化。這里不限定你的序列 / 反序列化算法執行邏輯,你只需要保證一個二叉樹可以被序列化為一個字符串并且將這個字符串反序列化為原始的樹結構。
提示: 輸入輸出格式與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode 序列化二叉樹的格式。你并非必須采取這種方式,你也可以采用其他的方法解決這個問題。
示例 1:
輸入:root = [1,2,3,null,null,4,5]
輸出:[1,2,3,null,null,4,5]
示例 2:
輸入:root = []
輸出:[]
示例 3:
輸入:root = [1]
輸出:[1]
示例 4:
輸入:root = [1,2]
輸出:[1,2]
解題思路
- 序列化時,先序遍歷二叉樹,使用null表示空節點,使用’,'分隔每一個節點
- 反序列化時,將字符串使用’,'分割回去原來的若干個節點元素,同樣先序遍歷這些節點,就能還原出這顆二叉樹
代碼
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/public class Codec {// Encodes a tree to a single string.public void se(TreeNode root,StringBuilder strings) {if(root==null)strings.append("null").append(',');else {strings.append(root.val).append(',');se(root.left,strings);se(root.right,strings);}}public String serialize(TreeNode root) {StringBuilder builder = new StringBuilder(); se(root,builder);return builder.toString();}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {String[] strings = data.split(",");return de(strings);}int cur=0;public TreeNode de(String[] strings){if(cur>=strings.length||strings[cur].equals("null")){cur++;return null; }else {TreeNode c = new TreeNode(Integer.parseInt(strings[cur]));cur++;c.left =de(strings);c.right=de(strings);return c;}}}// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));