题解 | #序列化二叉树#

序列化二叉树

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

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    // 我们采用后续遍历做一下
    // 拿{8,6,10,5,7,9,11}来说
    /*
        NULL 用#号代表,用逗号分隔元素
        所以后续遍历就是 左右中
        #,#,5,#,#,7,6,#,#,9,#,#,11,10,8,
    */
        string s;
    void ser(TreeNode* root, string& s) {
        if(root==nullptr) {
            s.push_back('#');
            s.push_back(',');
            return;
        }

        ser(root->left,s);
        ser(root->right,s);
        s+=to_string(root->val);
        s.push_back(',');

    }

    char* Serialize(TreeNode *root) {    
        ser(root,s);
        cout<<"ser: "<<s<<endl;
        return const_cast<char*>(s.c_str());
    }

    TreeNode* Des(string& s,int& index) {
        // 先拿到当前的元素
        if(index<0) {
            return nullptr;
        }
        if(s[index]=='#') {
            index--;
            index--;
            return nullptr;
        }
        int i = index;
        while(s[i]!=',') {
            i--;
        }
        string tmp = s.substr(i+1,index-i);
        cout<<"tmp: "<<tmp<<" ";
//         int num =0;
        int num = stoi(s.substr(i+1,index-i));
//         cout<<num<<endl;
        index=i-1;
//         cout<<"index: "<< index<<endl;
        TreeNode * root = new TreeNode(num);

        root->right = Des(s, index);
        root->left = Des(s, index);
        return root;
    }

    TreeNode* Deserialize(char *str) {
        string s(str);
        int index = s.size()-2;
        return Des(s, index);
    }


};
全部评论

相关推荐

米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
野猪不是猪🐗:现在的环境就是这样,供远大于求。 以前卡学历,现在最高学历不够卡了,还要卡第一学历。 还是不够筛,于是还要求得有实习、不能有gap等等... 可能这个岗位总共就一个hc,筛到最后还是有十几个人满足这些要求。他们都非常优秀,各方面都很棒。 那没办法了,看那个顺眼选哪个呗。 很残酷,也很现实
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务