[前序遍历]leetcode449:序列化和反序列化二叉搜索树(medium)

题目:
[前序遍历]leetcode449:序列化和反序列化二叉搜索树(medium)_第1张图片
题解:

  • 使用先序遍历(根左右)实现二叉树的序列化和反序列化,这里我们使用stringstream来存放字符串,因为这样可实现字符串的快速在尾部添加,以及反序列化时默认使用空格分割字符串。

代码如下:

class Codec {
public:

    TreeNode *node;
    // Encodes a tree to a single string.
    //题解:使用先序遍历实现二叉树的序列化和反序列化,
    //这里我们使用stringstream来存放字符串,因为这样可实现字符串的快速在尾部添加,以及反序列化时默认使用空格分割字符串
    string serialize(TreeNode* root){
        if(!root)return "";
        stringstream ss;
        preSerialize(root,ss);
        return ss.str();
    }

    //前序遍历生成字符串
    void preSerialize(TreeNode* root,stringstream& ss){
        //1、递归边界:到达空节点,添加#
        if(!root){
            ss<<"# ";
            return;
        }
        //2、递归表示式:添加节点值及空格
        ss<<to_string(root->val)<<" ";
        //3、缩小问题规模:递归添加左右子树的节点值
        preSerialize(root->left,ss);
        preSerialize(root->right,ss);
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if(data.empty())return nullptr;
        TreeNode* root=nullptr;
        stringstream ss(data);
        reBulid(root,ss);
        return root;
    }

    //注意这里的形参为指针的引用,也就是引用绑定的对象是指针(指针是对象,所以可以有引用)
    //这就是说这里我们传的是指针的引用(形参为引用来改变绑定对象的值),从而来添加左右子树
    void reBulid(TreeNode* &root,stringstream& ss){
        string t;
        ss>>t;
        //1、递归边界:到达空节点,将空节点添加到root中
        if(t[0]=='#'){
            root=nullptr;
            return;
        }
        //2、递归表示式:建立根节点的值
        root=new TreeNode(stoi(t));
        //3、缩小问题规模:建立左右子树
        reBulid(root->left,ss);
        reBulid(root->right,ss);
    }
};

你可能感兴趣的:(leetcode刷题,#,二叉搜索树)