297. 二叉樹的序列化與反序列化
知識點:二叉樹;遞迴
題目描述
序列化是將一個數據結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在一個檔案或者記憶體中,同時也可以通過網路傳輸到另一個計算機環境,採取相反方式重構得到原資料。
請設計一個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化演算法執行邏輯,你只需要保證一個二叉樹可以被序列化為一個字串並且將這個字串反序列化為原始的樹結構。
提示: 輸入輸出格式與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode 序列化二叉樹的格式。你並非必須採取這種方式,你也可以採用其他的方法解決這個問題。
示例
輸入:root = [1,2,3,null,null,4,5]
輸出:[1,2,3,null,null,4,5]
輸入:root = []
輸出:[]
輸入:root = [1]
輸出:[1]]
輸入:root = [1,2]
輸出:[1,2]
解法一:遞迴
序列化
函式功能:將二叉樹序列化
1.終止條件:root == null, 返回"none,";
2.該做什麼:想一層節點該做什麼:將節點的值加入字串,然後把子樹遞迴。
3.什麼時候做:自己先加入,再加子樹,先序。
反序列化
函式功能:將字串反序列化
1.終止條件:如果陣列的索引超出了長度,返回null;
2.該做什麼:想一層節點該做什麼:如果字元值是"none",返回null,如果不是,就以該值建立node,然後再去建立左子樹,右子樹。
3.什麼時候做:陣列的索引越來越大,因為前面先序的原因,第一個是根,所以先序。
/**
* 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 String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
if(root == null){
sb.append("none,");
return sb.toString();
}
sb.append(root.val+",");
sb.append(serialize(root.left));
sb.append(serialize(root.right));
return sb.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] str = data.split(","); //分割成陣列;
Queue<String> queue = new LinkedList<>(Arrays.asList(str)); //全部入隊;
return deserialize(queue);
}
private TreeNode deserialize(Queue<String> queue){
String head = queue.poll();
if("none".equals(head)){
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(head));
root.left = deserialize(queue);
root.right = deserialize(queue);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));
空間複雜度:O(N):堆疊的支出