剑指offer—序列化二叉树

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/10/12

题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树

解析:已知根据树的前序遍历和中序遍历序列可以还原出二叉树(
http://blog.csdn.net/zhangzhengyi03539/article/details/48831659 ,即可求解。

struct TreeNode 
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) :
        val(x), left(NULL), right(NULL) 
    {
    }
};

class Solution 
{
public:
    string ToString(int val)
    {
        stringstream ss;
        ss << val;
        return ss.str();
    }
    void split(string &s, string &delim, vector<int> &ret)
    {
        size_t last = 0;
        size_t index = s.find_first_of(delim, last);
        while (index != string::npos)
        {
            ret.push_back(stoi(s.substr(last, index - last)));
            last = index + 1;
            index = s.find_first_of(delim, last);
        }
        if (index - last>0)
        {
            ret.push_back(stoi(s.substr(last, index - last)));
        }
    }
    TreeNode* ContructRoot(vector<int> pre, vector<int> in)
    {
        TreeNode* root = new TreeNode(pre.front());
        pre.erase(pre.begin());
        vector<int> leftpre, rightpre, leftin, rightin;
        bool pass = false;
        while (in.empty() == false)
        {
            if (in.front() == root->val)
            {
                pass = true;
                in.erase(in.begin());
            }
            else
            {
                if (pass == false)
                {
                    leftpre.push_back(pre.front());
                    leftin.push_back(in.front());
                }
                else
                {
                    rightpre.push_back(pre.front());
                    rightin.push_back(in.front());
                }
                pre.erase(pre.begin());
                in.erase(in.begin());
            }
        }
        root->left = leftpre.size() > 0 ? ContructRoot(leftpre, leftin) : NULL;
        root->right = rightpre.size() > 0 ? ContructRoot(rightpre, rightin) : NULL;
        return root;
    }
    void MidTravel(TreeNode* root, string &midTravelString)
    {
        if (root == NULL)
            return;
        midTravelString += "," + ToString(root->val);
        MidTravel(root->left, midTravelString);
        MidTravel(root->right, midTravelString);
    }
    void PreTravel(TreeNode* root, string &preTravelString)
    {
        if (root == NULL)
            return;
        PreTravel(root->left, preTravelString);
        preTravelString += "," + ToString(root->val);
        PreTravel(root->right, preTravelString);
    }
    char* Serialize(TreeNode *root)
    {
        if (root == NULL)
            return NULL;
        string midTravelString;
        string preTravelString;
        MidTravel(root, midTravelString);
        PreTravel(root, preTravelString);
        string result = midTravelString.substr(1) + "-" + preTravelString.substr(1);
        char * data = (char*)malloc((result.length()+1)*sizeof(char));
        strcpy(data, result.c_str());
        return data;
    }
    TreeNode* Deserialize(char *str)
    {
        if (str == NULL)
            return NULL;
        string travel = str;
        string midTravelString, preTravelString;
        size_t flag = travel.find('-');
        midTravelString = travel.substr(0, flag);
        preTravelString = travel.substr(flag+1);
        vector<int> pre;
        vector<int> post;
        string delim = ",";
        split(midTravelString, delim, pre);
        split(preTravelString, delim, post);
        return ContructRoot(pre, post);
    }
};

int main(int argc, char* argv[])
{
    TreeNode* p1=NULL;
    Solution s;
    char *p = s.Serialize(p1);
    TreeNode* root = s.Deserialize(p);
    return 0;
}

你可能感兴趣的:(剑指offer—序列化二叉树)