题解 | #JZ37 序列化二叉树#

序列化二叉树

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:
    char* Serialize(TreeNode *root) {    
        vector<TreeNode*> curLvNodes, nextLvNodes;
        string str;
        
        if (root) curLvNodes.push_back(root);
        while (curLvNodes.size()) {
            int flg = 0;    //下一层不全为空标志
            for (int i=0; i!=curLvNodes.size(); ++i) {
                if (str.size()) str += ",";
                if (curLvNodes[i]) {
                    str += to_string(curLvNodes[i]->val);
                    nextLvNodes.push_back(curLvNodes[i]->left);
                    nextLvNodes.push_back(curLvNodes[i]->right);
                    if (curLvNodes[i]->left || curLvNodes[i]->right) flg = 1;
                } else {
                    str += "#";
                }
            }
            if (flg == 0) nextLvNodes.clear();    //下一层无有效节点,则清除
            curLvNodes.clear();
            curLvNodes.swap(nextLvNodes);
        }
        
        return strdup(str.c_str());
    }
    TreeNode* Deserialize(char *str) {
        char *p = str;
        TreeNode *root=nullptr;
        vector<TreeNode*> nodeVec;
        int pos = 0;
        
        if (!str || strlen(str)==0) return nullptr;
        
        while (p) {
            if (root == nullptr) {
                root = new TreeNode(atoi(p));
                nodeVec.push_back(root);
            } else {
                if (*p != '#') {
                    nodeVec[pos]->left = new TreeNode(atoi(p));
                    nodeVec.push_back(nodeVec[pos]->left);
                }
                p = strchr(p, ',') + 1;
                if (*p != '#') {
                    nodeVec[pos]->right = new TreeNode(atoi(p));
                    nodeVec.push_back(nodeVec[pos]->right);
                }
                ++pos;
            }
            
            p = strchr(p, ',');
            if (p) p += 1;
        }
        
        return root;
    }
};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务