题目
请实现两个函数,分别用来序列化和反序列化二叉树。
您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。
样例
你可以序列化如下的二叉树
8
/ \
12 2
/ \
6 4
为:”[8, 12, 2, null, null, 6, 4, null, null, null, null]”
注意:
以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。

解法:前序遍历

前序遍历和层序遍历都可以
时间复杂度O(n),空间复杂度O(1)

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. // Encodes a tree to a single string.
  13. string serialize(TreeNode* root) {
  14. string ans;
  15. dfs1(root, ans);
  16. return ans;
  17. }
  18. void dfs1(TreeNode* u, string &s) {
  19. if (!u) {
  20. s += "#,";
  21. return;
  22. }
  23. s += to_string(u->val) + ",";
  24. dfs1(u->left, s);
  25. dfs1(u->right, s);
  26. }
  27. // Decodes your encoded data to tree.
  28. TreeNode* deserialize(string data) {
  29. int p = 0;
  30. return dfs2(data, p);
  31. }
  32. TreeNode* dfs2(string &s, int &p) {
  33. if (s[p] == '#') {
  34. p += 2;
  35. return nullptr;
  36. }
  37. bool minus = false;
  38. int num = 0;
  39. while (s[p] != ',') {
  40. if (s[p] == '-') minus = true;
  41. else num = num * 10 + s[p] - '0';
  42. p++;
  43. }
  44. p++;
  45. if (minus) num = -num;
  46. auto root = new TreeNode(num);
  47. root->left = dfs2(s, p);
  48. root->right = dfs2(s, p);
  49. return root;
  50. }
  51. };