题解 | #序列化二叉树#

序列化二叉树

http://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84

  1. 注意用nullptr来代替真正的空指针,因为NULL就是0,虽然绝大多数情况下没问题,但是这个题就会出问题。
  2. 记得用to_string来转化数字,在数字位数大于1位时候。
  3. 转过来的时候用atoi(s.c_str());因为位数可能大于1;
  4. atoi 会自动遇到,停止。
  5. 注意char* 转 string以及 string 转 char* 的方式
  6. char*也可以取[]正常访问。
  7. 也是BFS解决树的构建问题。
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:

    string res="";

    char* Serialize(TreeNode *root) {    

        queue<TreeNode *> q;
        q.push(root);

        while(!q.empty()){
            TreeNode* node  = q.front();
            q.pop();

            //只有这样写,才是后序遍历
            if(node==nullptr){
                res+='#';
                res+=',';
                continue;
            }

            res+= to_string(node->val);
            res+=',';

            q.push(node->left);
            q.push(node->right);

        }

        //转换成string
        char* c = new char[res.length()+1];
        strcpy(c,res.c_str());
        return c;
    }


    TreeNode* Deserialize(char *str) {

        if(str==nullptr){
            return nullptr;
        }


        if(str[0]=='#'){
            return nullptr;
        }

        string s(str);//char* 这个函数char* 直接转 string

        queue<TreeNode*> nodes;



        TreeNode* root = new TreeNode(atoi(s.c_str()));//建立根节点//且可以直接截止到,之前的数字
        s = s.substr(s.find_first_of(',')+1);//下一个节点
        nodes.push(root);

        while(!nodes.empty()&&!s.empty()){
            TreeNode* node  = nodes.front();
            nodes.pop();

            if(s[0]=='#'){
                node->left = nullptr;//要改成这个。
                s = s.substr(2);//从下一个数开始

            }else{
                node->left = new TreeNode(atoi(s.c_str()));
                nodes.push(node->left);
                s = s.substr(s.find_first_of(',')+1);
            }

            if(s[0]=='#'){
                node->right = nullptr;//要改成这个。
                s = s.substr(2);//从下一个数开始

            }else{
                node->right = new TreeNode(atoi(s.c_str()));
                nodes.push(node->right);
                s = s.substr(s.find_first_of(',')+1);
            }
        }


        return root;


    }
};
剑指Offer 文章被收录于专栏

剑指offer的解析结合

全部评论

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务