zoukankan      html  css  js  c++  java
  • 剑指 Offer 37. 序列化二叉树 力扣(困难) 二叉树+string 语法题

    剑指 Offer 37. 序列化二叉树

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

    请实现两个函数,分别用来序列化和反序列化二叉树。

    你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

    提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

    示例:

    输入:root = [1,2,3,null,null,4,5]
    输出:[1,2,3,null,null,4,5]

    学习要点:

    int  转 string  : to_string(int)

    string 转 int   : stoi(string)

    string后面添加内容:

    字符串: .append( 串 )

    字符: .push_back(字符)

    代码:

    我才用层序遍历的方法,用“,”隔开节点,并且记录NULL

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Codec {
    public:
    
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {
          string s;
          if(root==NULL) return "";
          s.append(to_string(root->val));   //  to_string将数字变成string
          s+=',';
          queue<TreeNode*> Q;
          Q.push(root);
          while(!Q.empty())
          {
              TreeNode* p=Q.front();
              Q.pop();
              if(p->left!=NULL)
              {
                  Q.push(p->left);
                  s.append(to_string(p->left->val));
              } else s+='N';
              s+=',';
              if(p->right!=NULL)
              {
                  Q.push(p->right);
                  s.append(to_string(p->right->val));
              } else s+='N';
               s+=',';
          }
          return s;
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
    if (data.length()==0) return NULL; int i=0; string t; while(data[i]!=',') t.push_back(data[i++]); // 长度不为0,那肯定有数字 // append后面添加是字符串,push_back添加字符 int tnum=stoi(t); // 字符串变数字 i++; // 跳过逗号 TreeNode* head=new TreeNode(tnum); // 最后输出的头指针 TreeNode* head2=head; queue<TreeNode*> Q; Q.push(head2); while(!Q.empty()) { TreeNode* p=Q.front(); Q.pop(); // 处理左儿子 if(data[i]=='N') i+=2; //说明是空指针 else { string t; while(data[i]!=',') t.push_back(data[i++]); int tnum=stoi(t); i++; p->left=new TreeNode(tnum); Q.push(p->left); } // 处理右儿子 if(data[i]=='N') i+=2; //说明是空指针 else { string t; while(data[i]!=',') t.push_back(data[i++]); int tnum=stoi(t); i++; p->right=new TreeNode(tnum); Q.push(p->right); } if (i>=data.length()) break; } return head; } }; // Your Codec object will be instantiated and called as such: // Codec ser, deser; // TreeNode* ans = deser.deserialize(ser.serialize(root));
  • 相关阅读:
    如何使用VS2013进行单元测试和查看代码覆盖率
    荔枝架构演进历程读后感
    关于海尔电商峰值系统架构读后感
    苏宁易购:商品详情系统架构设计读后感
    第二阶段冲刺第四天
    第二阶段冲刺第五天
    第二阶段冲刺第三天
    第二阶段冲刺第二天
    第二阶段冲刺第一天
    第一阶段末尾
  • 原文地址:https://www.cnblogs.com/stepping/p/15113161.html
Copyright © 2011-2022 走看看