【剣指offer】二叉木をシーケンス化

1451 ワード

1、テーマの説明
ツリーをシーケンス化および逆シーケンス化するために使用される2つの関数を実装してください.
ツリーが文字列にシーケンス化され、元のツリー構造に逆シーケンス化できることを確認する必要があります.
サンプルは、次のツリー8/12 2/6 4をシーケンス化できます.
「[8,12,2,null,null,6,4,null,null,null,null,null」
2、問題の説明:
シーケンス化ツリーと逆シーケンス化.
3、問題のポイント:
前の順序の中で順序の後で、階層はすべてできます.
4、C++コード:
class Solution {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string res;
        dfs_s(root, res);
        return res;
    }
    void dfs_s(TreeNode* root, string &res) {
        if (!root) {
            res += "null ";
            return;
        }
        res += to_string(root->val) + ' ';
        dfs_s(root->left, res);
        dfs_s(root->right, res);
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int u = 0;
        return dfs_d(data, u);
    }
    TreeNode* dfs_d(string data, int &u) {
        if (u == data.size()) return NULL;
        int k = u;
        while(data[k] != ' ') k ++;
        if (data[u] == 'n') {
            u = k + 1;
            return NULL;
        }
        int sum = 0;
        for (int i = u; i < k; i ++) {
            sum = sum * 10 + data[i] - '0';
        }
        u = k + 1;
        auto root = new TreeNode(sum);
        root->left = dfs_d(data, u);
        root->right = dfs_d(data, u);
        return root;
    }
};