1. 程式人生 > 其它 >Leetcode NO.297 Serialize And Deserialize Binary Tree

Leetcode NO.297 Serialize And Deserialize Binary Tree

目錄

1.問題描述

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

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

提示: 輸入輸出格式與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode 序列化二叉樹的格式。你並非必須採取這種方式,你也可以採用其他的方法解決這個問題。

2.測試用例

示例 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]

3.提示

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

4.程式碼

1.DFS序列化 二叉樹
code
public class Top297_Serialize_And_Deserialize_Binary_Tree {
    public String serialize(TreeNode root) {
        StringBuffer res = new StringBuffer();
        res.append("[");
        dfsSerialize(root, res);
        res.deleteCharAt(res.length() - 1);
        res.append("]");
        return res.toString();
    }
    private void dfsSerialize(TreeNode root, StringBuffer res) {
        if (root == null) {
            res.append("null,");
            return;
        }
        res.append(root.val).append(",");
        dfsSerialize(root.left, res);
        dfsSerialize(root.right, res);
    }

    public TreeNode deserialize(String data) {
        String[] split = data.split(",");
        LinkedList<String> led = new LinkedList<>(Arrays.asList(split));
        String first = led.getFirst();
        String firstEle = first.split("\\[")[1];
        led.removeFirst();
        led.addFirst(firstEle);

        String lastEle = led.getLast().substring(0, led.getLast().length() - 1);
        led.removeLast();
        led.addLast(lastEle);

        return dfsDeserialize(led);
    }

    private TreeNode dfsDeserialize(LinkedList<String> led) {
        String first = led.peek();
        if ("null".equals(first) || first == null || "".equals(first)) {
            led.poll();
            return null;
        }

        TreeNode node = new TreeNode(Integer.parseInt(first));
        led.poll();
        node.left = dfsDeserialize(led);
        node.right = dfsDeserialize(led);
        return node;
    }
}


public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;


    public TreeNode() {

    }

    public TreeNode(int val) {
        this.val = val;
    }

    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
複雜度
* 時間複雜度 O(n)
* 空間複雜度 O(n)