难点在于字符串解析和重建二叉树

序列化二叉树

https://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:
    string req;
    char* Serialize(TreeNode *root) {    
        if(root == nullptr) return nullptr;// 如果根节点为空就返回空指针
        queue<TreeNode *> q;
        if(root != nullptr) q.push(root);
        while(!q.empty())
        {
            TreeNode *front = q.front();
            q.pop();
            if(front) req += to_string(front->val) + ",";// 一个值对应"val,"
            else req += "#,";// 空节点用'#'代替
            if(front)// 全部插入,最后一定有后缀'#'
            {
                q.push(front->left);
                q.push(front->right);
            }
        }
        cout << req << endl;// 打印测试一下
        return &req[0];
    }
    TreeNode* Deserialize(char *str) {
        if(str == nullptr) return nullptr;// 如果字符串为空,那还反序列坤毛
        string res(str);
        queue<TreeNode *> q;
        int left = 0,right = 0;// 双指针算法来了...

        /*-----------这里是反序列化的关键----------*/
        right = res.find(",",left);
        if(right == string::npos) return nullptr;// 没找到任何逗号(不可能发生)
        string root_val = res.substr(left,right-left);
        ++right;
        left = right;
        cout << root_val << endl;
        if(root_val == "#") return nullptr;// 开头就是空,别玩了
        /*-----------这里是反序列化的关键----------*/
        
        TreeNode *root = new TreeNode(std::atoi(root_val.c_str()));// 根节点
        q.push(root);
        while(!q.empty() && right < res.size())
        {
            TreeNode *front = q.front();
            q.pop();

            if(right < res.size())
            {
                right = res.find(",",left);
                if(right == string::npos) return nullptr;// 没找到任何逗号(不可能发生)
                string root_val = res.substr(left,right-left);
                ++right;
                left = right;
                cout << root_val << endl;
                if(root_val != "#")
                {
                    front->left = new TreeNode(std::atoi(root_val.c_str()));
                    q.push(front->left);
                }
            }

            if(right < res.size())
            {
                right = res.find(",",left);
                if(right == string::npos) return nullptr;// 没找到任何逗号(不可能发生)
                string root_val = res.substr(left,right-left);
                ++right;
                left = right;
                cout << root_val << endl;
                if(root_val != "#")
                {
                    front->right = new TreeNode(std::atoi(root_val.c_str()));
                    q.push(front->right);
                }
            }
        }
        return root;
    }   
};

全部评论

相关推荐

07-23 14:04
东北大学 C++
既然这样,为什么不点击就送呢
牛马88号:因为你合适。但有很多笔试就挂了、通过了再排序的
点赞 评论 收藏
分享
06-17 21:57
门头沟学院 Java
白友:噗嗤,我发现有些人事就爱发这些,明明已读不回就行了,就是要恶心人
点赞 评论 收藏
分享
07-24 12:30
湘潭大学 营销
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务