剑指 Offer -- 序列化二叉树(六十一)

序列化二叉树(六十一)

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

代码(已在牛客 AC)

这道题呢, 可以使用二叉树的前序遍历将二叉树进行序列化, 由于用的是 C++, 因此使用 <sstream> 中定义的 ostringstreamistringstream 还是非常方便的.

使用 serialize(root, out) 函数对二叉树进行前序遍历, 如果遇到空节点, 那么输出 # 后直接返回; 否则输出 root->val. 之后要将 ostringstream 中的字符拷出来, 应该使用 out.str() 返回保存的字符串, 而要后的 C 风格的字符串, 需要调用 c_str() 方法.

对于反序列化, 使用 deserialize 方法实现, 其中还使用了 istringstream 对象, 使用前序遍历, 对于输入到 val 中的值, 判断它是否为 #, 如果是的话, 那么说明是空节点, 返回 nullptr, 否则返回 TreeNode(stoi(val)).

class Solution {
public:
    char* Serialize(TreeNode *root) {    
        ostringstream out;
        serialize(root, out);
        char *res = new char[out.str().length() + 1];
        strcpy(res, out.str().c_str());
        return res;
    }
    TreeNode* Deserialize(char *str) {
        istringstream in(str);
        return deserialize(in);
    }
private:
    // 不论是序列化还是反序列化, 都使用二叉树的前序遍历.
    void serialize(TreeNode *root, ostringstream &out) {
        if (!root) { out << "# "; return; }
        out << root->val << " ";
        serialize(root->left, out);
        serialize(root->right, out);
    }

    TreeNode* deserialize(istringstream &in) {
        string val;
        in >> val;
        if (val == "#") return nullptr;
        TreeNode *root = new TreeNode(stoi(val));
        root->left = deserialize(in);
        root->right = deserialize(in);
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值