二叉搜索树是二叉树的一种,也可以使用这种方法。

BFS, 按层序列化和反序列

https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/
image.png
这是种什么表示方法?

反序列化

  1. vector<int> nums = {1, 2, 3, -1, -1, 4, 5};
  2. struct Node {
  3. int val;
  4. Node* left;
  5. Node* right;
  6. Node(int x) : val(x), left(nullptr), right(nullptr) {}
  7. };
  8. Node* GetNode(vector<int>& nums)
  9. {
  10. Node* root = new Node(nums[0]);
  11. queue<Node*> que;
  12. que.push(root);
  13. int k = 1;
  14. while (k < nums.size()) {
  15. int n = que.size();
  16. for (int i = 0; i < n; i++) {
  17. Node* p = que.front();
  18. que.pop();
  19. if (nums[k] == -1 && nums[k + 1] == -1) {
  20. k+=2;
  21. continue;
  22. }
  23. if (nums[k] != -1) {
  24. p->left = new Node(nums[k]);
  25. que.push(p->left);
  26. cout << p->left->val << ", ";
  27. }
  28. k++;
  29. if (nums[k] != -1) {
  30. p->right = new Node(nums[k]);
  31. que.push(p->right);
  32. cout << p->right->val << ", ";
  33. }
  34. k++;
  35. }
  36. }
  37. return root;
  38. }

DFS、前序遍历

https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/

  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 Codec {
  11. public:
  12. // Encodes a tree to a single string.
  13. string serialize(TreeNode* root) {
  14. if (root == nullptr) {
  15. return "#";
  16. }
  17. return to_string(root->val) + "," + serialize(root->left) + "," + serialize(root->right);
  18. }
  19. TreeNode* rdeserialize(vector<string>& vec, int& index)
  20. {
  21. if (vec.size() <= index) {
  22. return nullptr;
  23. }
  24. if (vec[index] == "#") {
  25. index++;
  26. return nullptr;
  27. }
  28. TreeNode* node = new TreeNode(stoi(vec[index]));
  29. index++;
  30. node->left = rdeserialize(vec, index);
  31. node->right = rdeserialize(vec, index);
  32. return node;
  33. }
  34. // Decodes your encoded data to tree.
  35. TreeNode* deserialize(string data) {
  36. vector<string> vec;
  37. string tmp;
  38. for (auto& a : data) {
  39. if (a == ',') {
  40. vec.push_back(tmp);
  41. tmp.clear();
  42. } else {
  43. tmp += a;
  44. }
  45. }
  46. if (tmp.size() != 0) {
  47. vec.push_back(tmp);
  48. }
  49. int index = 0;
  50. TreeNode* root = rdeserialize(vec, index);
  51. return root;
  52. }
  53. };
  54. // Your Codec object will be instantiated and called as such:
  55. // Codec* ser = new Codec();
  56. // Codec* deser = new Codec();
  57. // string tree = ser->serialize(root);
  58. // TreeNode* ans = deser->deserialize(tree);
  59. // return ans;