二叉树序列化

    1. class Codec {
    2. public:
    3. string serialize(TreeNode* root) {
    4. if (!root) {
    5. return "X";
    6. }
    7. auto left = "(" + serialize(root->left) + ")";
    8. auto right = "(" + serialize(root->right) + ")";
    9. return left + to_string(root->val) + right;
    10. }
    11. inline TreeNode* parseSubtree(const string &data, int &ptr) {
    12. ++ptr; // 跳过左括号
    13. auto subtree = parse(data, ptr);
    14. ++ptr; // 跳过右括号
    15. return subtree;
    16. }
    17. inline int parseInt(const string &data, int &ptr) {
    18. int x = 0, sgn = 1;
    19. if (!isdigit(data[ptr])) {
    20. sgn = -1;
    21. ++ptr;
    22. }
    23. while (isdigit(data[ptr])) {
    24. x = x * 10 + data[ptr++] - '0';
    25. }
    26. return x * sgn;
    27. }
    28. TreeNode* parse(const string &data, int &ptr) {
    29. if (data[ptr] == 'X') {
    30. ++ptr;
    31. return nullptr;
    32. }
    33. auto cur = new TreeNode(0);
    34. cur->left = parseSubtree(data, ptr);
    35. cur->val = parseInt(data, ptr);
    36. cur->right = parseSubtree(data, ptr);
    37. return cur;
    38. }
    39. TreeNode* deserialize(string data) {
    40. int ptr = 0;
    41. return parse(data, ptr);
    42. }
    43. };