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));
  • 相关阅读:
    【NX二次开发】获取体是实体还是片体UF_MODL_ask_body_type()
    【creo】CREO5.0+VS2019配置(还没写完)
    【NX二次开发】导出x_t、导入x_t例子,UF_PS_export_data、UF_PS_import_data
    UG_PS Parasolid相关的操作
    【NX二次开发】创建老版的基准平面uf5374
    UnityShader之固定管线命令Combine纹理混合【Shader资料4】
    UnityShader之固定管线Fixed Function Shader【Shader资料3】
    UnityShader之Shader分类篇【Shader资料2】
    UnityShader之Shader格式篇【Shader资料1】
    Unity3D事件函数的执行顺序
  • 原文地址:https://www.cnblogs.com/stepping/p/15113161.html
Copyright © 2011-2022 走看看