leetcode 297. 二叉树的序列化与反序列化

打印 上一主题 下一主题

主题 1014|帖子 1014|积分 3042

标题如下

  1. 我们常常说单独先序遍历不能完整的表示一棵树是有前提条件的。
  2. 为什么?先序遍历是按 根节点 左子树 右子树的方向遍历树且遇到空子树直接返回,这样会造成我们并不知道某个节点的左右子树存在与否,故我们无法确定树的形状。但是如果我们在遍历的时候加入该子树为空的标记不就知道某个节点后面跟的是左子树还是右子树了吗?好了,把这个思想用到本题就迎刃而解了。
复制代码
通过代码
  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.     string ans = "";
  13.    
  14.     void pre(TreeNode* root) {
  15.         if (root == nullptr){
  16.             ans += "n,";//用n表示该子树为空
  17.             return;
  18.         }
  19.             
  20.         ans += to_string(root->val);
  21.         ans += ",";
  22.         pre(root->left);
  23.         pre(root->right);
  24.     }
  25.    
  26.     // Encodes a tree to a single string.
  27.     string serialize(TreeNode* root) {
  28.         if (root == nullptr)
  29.             return ans;
  30.         pre(root);
  31.         return ans;
  32.     }
  33.     TreeNode* build(list<string> &pre){
  34.         if(pre.size() == 0)return nullptr;
  35.         if(pre.front() == "n"){//没有左子树或者右子树
  36.             pre.erase(pre.begin());
  37.             return nullptr;
  38.         }
  39.         TreeNode *a = new TreeNode(stoi(pre.front()));
  40.         pre.erase(pre.begin());
  41.         a -> left = build(pre);
  42.         a -> right = build(pre);
  43.         return a;
  44.     }
  45.     // Decodes your encoded data to tree.
  46.     TreeNode* deserialize(string data) {
  47.         if (data.size() == 0)
  48.             return nullptr;
  49.         int n = data.size();
  50.        // cout << data << endl;
  51.         int s = 0,end = 0;
  52.         list<string> vs;
  53.         while(true){
  54.             end = data.find(',',s);
  55.             vs.emplace_back(data.substr(s,end - s));
  56.             s = end + 1;
  57.             if(end == n - 1)break;
  58.         }
  59.       
  60.       TreeNode *a = build(vs);
  61.         return a;
  62.     }
  63. };
  64. // Your Codec object will be instantiated and called as such:
  65. // Codec ser, deser;
  66. // TreeNode* ans = deser.deserialize(ser.serialize(root));
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表