• 剑指 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));
  • 相关阅读:
    《校园封神榜》第二阶段个人工作总结——第五天
    寻找水王2——寻找三个小水王
    站立会议04(第二次冲刺)
    站立会议03(第二次冲刺)
    站立会议02(第二次冲刺)
    站立会议01(第二次冲刺)
    测试计划
    评价cnblogs.com的用户体验
    第一次冲刺各组评价的回复
    第一次冲刺对各组的评价
  • 原文地址:https://www.cnblogs.com/stepping/p/15113161.html
Copyright © 2020-2023  润新知