面試題37:序列化二叉樹

鹹魚不會游泳發表於2020-12-04

題目:請實現兩個函式,分別用來序列化和反序列化二叉樹。
如:將樹序列化為字串 “[1,2,3,null,null,4,5]”
還要將字串反序列化為二叉樹

序列化方法

佇列進行層次遍歷,把結點一個個加入到結果集中

  • 時間複雜度 O(n)
  • 空間複雜度 O(n),需要開闢一個長度為 n 的佇列

反序列化方法

根據二叉樹結點之間的運算關係進行求解,若結點 cur 的下標為 x ,那麼其左子結點下標為 2 * x + 1,右子節點的下標為 2 * x + 2。雖然知道了結點下標的關係,但是還是需要遍歷樹,需要用佇列來模擬。

  • 時間複雜度O(n)
  • 空間複雜度On,)
public class Codec {
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if (root == null) {
            return "[]";
        }
        StringBuilder res = new StringBuilder("[");
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node != null) {
                res.append(node.val + ",");
                queue.offer(node.left);
                queue.offer(node.right);
            } else {
                res.append("null,");
            }
        }
        res.deleteCharAt(res.length() - 1);
        res.append("]");
        return res.toString();
    }
    
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if (data.equals("[]")) {
            return null;
        }
        String[] vals = data.substring(1, data.length() - 1).split(",");
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int i = 1;
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            // 為空的話就跳過,不用再考慮,所以有子結點的話,就一定會有值
            if (!vals[i].equals("null")) {
                node.left = new TreeNode(Integer.parseInt(vals[i]));
                queue.offer(node.left);
            }
            i++;
            if (!vals[i].equals("null")) {
                node.right = new TreeNode(Integer.parseInt(vals[i]));
                queue.offer(node.right);
            }
            i++;
        }
        return root;
    }
}

相關文章