297. Serialize and Deserialize Binary Tree

Сериализация — это процесс преобразования структуры данных или объекта в последовательность битов, чтобы их можно было сохранить в файле или буфере памяти или передать по сетевому соединению для последующего восстановления в той же или другой компьютерной среде.

C# решение

сопоставлено/оригинал
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
public class Codec {
    private void Rserialize(TreeNode root, StringBuilder str) {
        if (root == null) {
            str.Append("null,");
        } else {
            str.Append(root.val).Append(",");
            Rserialize(root.left, str);
            Rserialize(root.right, str);
        }
    }
    public string Serialize(TreeNode root) {
        StringBuilder str = new StringBuilder();
        Rserialize(root, str);
        return str.ToString();
    }
    private TreeNode Rdeserialize(Queue<string> data) {
        if (data.Peek() == "null") {
            data.Dequeue();
            return null;
        }
        TreeNode root = new TreeNode(int.Parse(data.Dequeue()));
        root.left = Rdeserialize(data);
        root.right = Rdeserialize(data);
        return root;
    }
    public TreeNode Deserialize(string data) {
        Queue<string> dataArray = new Queue<string>(data.Split(new char[] { ',' }));
        return Rdeserialize(dataArray);
    }
}

C++ решение

auto-draft, проверить перед отправкой
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
public class Codec {
    private void Rserialize(TreeNode root, StringBuilder str) {
        if (root == null) {
            str.Append("null,");
        } else {
            str.Append(root.val).Append(",");
            Rserialize(root.left, str);
            Rserialize(root.right, str);
        }
    }
    public string Serialize(TreeNode root) {
        StringBuilder str = new StringBuilder();
        Rserialize(root, str);
        return str.ToString();
    }
    private TreeNode Rdeserialize(queue<string> data) {
        if (data.Peek() == "null") {
            data.Dequeue();
            return null;
        }
        TreeNode root = new TreeNode(int.Parse(data.Dequeue()));
        root.left = Rdeserialize(data);
        root.right = Rdeserialize(data);
        return root;
    }
    public TreeNode Deserialize(string data) {
        queue<string> dataArray = new queue<string>(data.Split(new char[] { ',' }));
        return Rdeserialize(dataArray);
    }
}

Java решение

сопоставлено/оригинал
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Codec {
    private void rserialize(TreeNode root, StringBuilder str) {
        if (root == null) {
            str.append("null,");
        } else {
            str.append(root.val).append(",");
            rserialize(root.left, str);
            rserialize(root.right, str);
        }
    }

    public String serialize(TreeNode root) {
        StringBuilder str = new StringBuilder();
        rserialize(root, str);
        return str.toString();
    }

    private TreeNode rdeserialize(LinkedList<String> data) {
        if (data.get(0).equals("null")) {
            data.remove(0);
            return null;
        }

        TreeNode root = new TreeNode(Integer.parseInt(data.remove(0)));
        root.left = rdeserialize(data);
        root.right = rdeserialize(data);
        return root;
    }

JavaScript решение

сопоставлено/оригинал
class TreeNode {
    constructor(val = 0, left = null, right = null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

class Codec {
    rserialize(root, str) {
        if (root === null) {
            str.push("null");
        } else {
            str.push(String(root.val));
            this.rserialize(root.left, str);
            this.rserialize(root.right, str);
        }
    }

    serialize(root) {
        const str = [];
        this.rserialize(root, str);
        return str.join(",");
    }

    rdeserialize(data) {
        if (data[0] === "null") {
            data.shift();
            return null;
        }

        const root = new TreeNode(Number(data.shift()));
        root.left = this.rdeserialize(data);
        root.right = this.rdeserialize(data);
        return root;
    }

    deserialize(data) {
        const dataArray = data.split(",");
        return this.rdeserialize(dataArray);
    }
}

Python решение

сопоставлено/оригинал
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Codec:
    def rserialize(self, root, string):
        if root is None:
            string += "null,"
        else:
            string += str(root.val) + ","
            string = self.rserialize(root.left, string)
            string = self.rserialize(root.right, string)
        return string

    def serialize(self, root):
        return self.rserialize(root, "")

    def rdeserialize(self, data_list):
        if data_list[0] == "null":
            data_list.pop(0)
            return None

        root = TreeNode(int(data_list.pop(0)))
        root.left = self.rdeserialize(data_list)
        root.right = self.rdeserialize(data_list)
        return root

    def deserialize(self, data):
        data_list = data.split(',')
        return self.rdeserialize(data_list)

Go решение

сопоставлено/оригинал
package main

import (
    "strconv"
    "strings"
)

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

type Codec struct{}

func (c *Codec) rserialize(root *TreeNode, str *strings.Builder) {
    if root == nil {
        str.WriteString("null,")
    } else {
        str.WriteString(strconv.Itoa(root.Val) + ",")
        c.rserialize(root.Left, str)
        c.rserialize(root.Right, str)
    }
}

func (c *Codec) serialize(root *TreeNode) string {
    var str strings.Builder
    c.rserialize(root, &str)
    return str.String()
}

func (c *Codec) rdeserialize(data *[]string) *TreeNode {
    if (*data)[0] == "null" {
        *data = (*data)[1:]
        return nil
    }

    val, _ := strconv.Atoi((*data)[0])
    root := &TreeNode{Val: val}
    *data = (*data)[1:]
    root.Left = c.rdeserialize(data)
    root.Right = c.rdeserialize(data)
    return root
}

func (c *Codec) deserialize(data string) *TreeNode {
    dataArray := strings.Split(data, ",")
    return c.rdeserialize(&dataArray)
}

Algorithm

Уточнение: формат ввода/вывода такой же, как в LeetCode для сериализации бинарного дерева. Вам не обязательно придерживаться этого формата, так что будьте креативны и придумайте свои подходы.

Пример:

Input: root = [1,2,3,null,null,4,5]

Output: [1,2,3,null,null,4,5]

👨‍💻

Алгоритм:

Сериализация дерева:

Используйте рекурсивный обход дерева в порядке root -> left subtree -> right subtree.

Для каждого узла добавляйте его значение в строку сериализации. Если узел пустой, добавляйте "None".

Пример:

Начните с корня, узел 1, строка сериализации становится "1,".

Переходите к левому поддереву с корнем 2, строка сериализации становится "1,2,".

Для узла 2, посетите его левый узел 3 ("1,2,3,None,None,") и правый узел 4 ("1,2,3,None,None,4,None,None").

Возвращайтесь к корню 1 и посетите его правое поддерево, узел 5 ("1,2,3,None,None,4,None,None,5,None,None,").

Десериализация строки:

Разделите строку на список значений.

Используйте рекурсивную функцию для создания узлов дерева, извлекая значения из списка и восстанавливая структуру дерева. Если значение "None", узел пустой.

😎

Вакансии для этой задачи

Показаны активные вакансии с пересечением по тегам задачи.

Все вакансии
Активных вакансий пока нет.