序列化二叉树(模拟)

题目来源https://www.acwing.com/problem/content/31/

 思路:

题目意思是让你通过给定的二叉树自定义生成一段字符串,再用这个字符串重新解析成二叉树。

序列化使用先序遍历,遇到空节点添加"null ",其他节点用to_string转为字符串即可。

反序列化从左往右遍历字符串,还是用先序遍历的方式建树,利用空格把节点分隔开,将字符串转化为数字。

如果是空节点,判断该字符是’n',返回即可。u记录当前字符,pos记录当前字符串数字后面的空格位置。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string str;
        if(root==NULL){str+="null ";return str;}
        str+=to_string(root->val)+" ";
        str+=serialize(root->left);
        str+=serialize(root->right);
        return str;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int u=0;
        return dfs_d(data,u);//
    }
    TreeNode* dfs_d(string data,int &u){
        int pos=u;
        while(data[pos]!=' ')pos++;
        if(data[u]=='n'){
            u=pos+1;
            return NULL;
        }
        int val=0;
        if(data[u]=='-'){
            for(int i=u+1;i<pos;i++){
                val=val*10+data[i]-'0';
            }
            val=-val;
        }
        else{
            for(int i=u;i<pos;i++){
                val=val*10+data[i]-'0';
            }
        }
        u=pos+1;
        auto root=new TreeNode(val);
        root->left=dfs_d(data,u);
        root->right=dfs_d(data,u);
        return root;
    }
};

 

posted @ 2020-10-01 00:12  mohari  阅读(164)  评论(0编辑  收藏  举报