1. 程式人生 > 其它 >LeetCode297 二叉樹的序列化與反序列化

LeetCode297 二叉樹的序列化與反序列化

題目

序列化是將一個數據結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在一個檔案或者記憶體中,同時也可以通過網路傳輸到另一個計算機環境,採取相反方式重構得到原資料。

請設計一個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化演算法執行邏輯,你只需要保證一個二叉樹可以被序列化為一個字串並且將這個字串反序列化為原始的樹結構。

提示: 輸入輸出格式與 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]

提示:
樹中結點數在範圍 [0, 104] 內
-1000 <= Node.val <= 1000

方法

深度優先遍歷BFS(前序)

用前序遍歷儲存節點的值為字串,並用逗號分割,然後反序列化時,也用前序遍歷從頭到尾依次去除字元陣列

  • 時間複雜度:O(n),n為節點個數
  • 空間複雜度:O(n)
public class Codec {
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root==null){
            return "null";
        }
        String val = String.valueOf(root.val);
        return val+","+serialize(root.left)+","+serialize(root.right);
    }
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        String[] arr = data.split(",");
        return dfs(new LinkedList(Arrays.asList(arr)));
    }
    private TreeNode dfs(LinkedList<String> arr){
        if(arr.get(0).equals("null")){
            arr.remove(0);
            return null;
        }
        int val = Integer.parseInt(arr.get(0));
        TreeNode root = new TreeNode(val);
        arr.remove(0);
        root.left = dfs(arr);
        root.right = dfs(arr);
        return root;
    }
}

廣度優先遍歷