1. 程式人生 > 其它 >LeetCode No449. 序列化和反序列化二叉搜尋樹

LeetCode No449. 序列化和反序列化二叉搜尋樹

題目

序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同一個或另一個計算機環境中重建。

設計一個演算法來序列化和反序列化 二叉搜尋樹 。 對序列化/反序列化演算法的工作方式沒有限制。 您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字串反序列化為最初的二叉搜尋樹。

編碼的字串應儘可能緊湊。

示例 1:

輸入:root = [2,1,3]
輸出:[2,1,3]

示例 2:

輸入:root = []
輸出:[]

提示:

樹中節點數範圍是 [0, 10^4]
0 <= Node.val <= 10^4
題目資料 保證 輸入的樹是一棵二叉搜尋樹。

思路

對數的序列化其實就是遍歷樹,前序遍歷或者後序遍歷都可,反序列化而言,只要只要前序遍歷或者後序遍歷,然後再加上中序遍歷即可將樹反序列化回來,而且題目給的數是二叉搜尋樹,中序遍歷其實就是前序遍歷或者後序遍歷的排序順序,但是事實上我們是可以不用真實的去把中序遍歷構建出來,根據二叉搜尋樹的特殊性(左節點比根小,右節點比根大),就只要知道前序或後序遍歷中的其中一種即可,我這邊用的是前序遍歷。

AC程式碼

點選檢視程式碼
/**
 * 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) {
        List<Integer> list = new ArrayList<>();
        preOrder(root, list);
        return list.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        data = data.substring(1, data.length()-1);
        if( data.isEmpty() ) {
            return null;
        }
        String[] str = data.split(", ");
        return  DFS(0, str.length-1, str);
    }

    private void preOrder(TreeNode node, List<Integer> list) {
        if( node == null ) {
            return ;
        }
        list.add(node.val);
        preOrder(node.left, list);
        preOrder(node.right, list);
    }

    private TreeNode DFS(int low, int high, String[] str) {
        if( low > high ) {
            return null;
        }
        int num = Integer.parseInt(str[low]);
        TreeNode res = new TreeNode(num);
        int mid = low + 1;
        // 左節點都比根節點小
        while( mid<=high && Integer.parseInt(str[mid])<=num ) {
            mid ++;
        }
        res.left = DFS(low+1, mid-1, str);
        res.right = DFS(mid, high, str);
        return res;
    }

}

// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// String tree = ser.serialize(root);
// TreeNode ans = deser.deserialize(tree);
// return ans;