【LeetCode】297. Serialize and Deserialize Binary Tree

二叉树的序列化与反序列化。

如果使用string作为媒介来存储,传递序列化结果的话,会给反序列话带来很多不方便。

这里学会了使用 sstream 中的 输入流'istringstream' 和 输出流'ostringstream'.

istringstream in;

in >> str;

这里没执行一次就会倒出一个string (因为in流中使用了' '空格 作为分割符, 所以可以分成很多个string)

建树的时候使用先序建立二叉树。

关键代码如下:

TreeNode* build(istringstream in){
  if(#) return null;
  else{
     new a node
     newnode -> left  = build(in)
     newnode -> right = build(in)
  }        
}
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        ostringstream out;
        backtrack(root, out);
        return out.str();
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        istringstream in(data);
        return build(in);
    }
    
private:
    void backtrack(TreeNode *rt, ostringstream &out){
        if(rt){
            out << rt -> val << " ";
            backtrack(rt -> left, out);
            backtrack(rt -> right, out);
        }else{
            out << "#"<<" ";
        }
    }
    
    // 形如: 1 # 2 其中树节点必为满树空节点用#表示。中间用空格分割。
    TreeNode* build(istringstream &in){
        string str = "";
        in >> str;
        if(str == "#" || str == ""){
            return NULL;
        }else{
            TreeNode *rt = new TreeNode(atoi(str.c_str()));
            rt -> left = build(in);
            rt -> right = build(in);
            return rt;
        }
    }
};

// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));

 

posted on 2017-05-25 21:25  暴力的轮胎  阅读(207)  评论(0编辑  收藏  举报

导航