Lintcode---二叉树的序列化和反序列化

设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。

如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。

注意事项

There is no limit of how you deserialize or serialize a binary tree, LintCode will take your output ofserialize as the input of deserialize, it won‘t check the result of serialize.

您在真实的面试中是否遇到过这个题?

Yes

样例

给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构:

  3
 / 9  20
  /   15   7

我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。

你可以采用其他的方法进行序列化和反序列化。

    思路:在这里使用先根遍历来实现;

本题目难点在于,里面穿插关于字符串和整数间的互相转换。
               在序列化时,空节点的表示,不同节点值之间的分割。
               在反序列化时,字符串每个字符遍历时的控制条件和操作,以及将字符串转换为整数;

参考:http://blog.csdn.net/waltonhuang/article/details/51979479

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
public:
    /**
     * This method will be invoked first, you should design your own algorithm
     * to serialize a binary tree which denote by a root node to a string which
     * can be easily deserialized by your own "deserialize" method later.
     */

    /*
    思路:感觉上用BFS更容易解决,在这里使用先根遍历来实现;
    参考:http://blog.csdn.net/waltonhuang/article/details/51979479
    本题目难点在于,里面穿插关于字符串和整数间的互相转换。
    在序列化时,空节点的表示,不同节点值之间的分割。
    在反序列化时,字符串每个字符遍历时的控制条件和操作,以及将字符串转换为整数;
    */

    string serialize(TreeNode *root) {
        // write your code here
        string s = "";
        writeTree(s, root);
        return s;
    }

    void writeTree(string &s, TreeNode* root){

        if (root == NULL){
            s += "# ";
            return;
        }

        s += (to_string(root->val) + ‘ ‘);
        writeTree(s, root->left);
        writeTree(s, root->right);
    }

    /**
     * This method will be invoked second, the argument data is what exactly
     * you serialized at method "serialize", that means the data is not given by
     * system, it‘s given by your own serialize method. So the format of data is
     * designed by yourself, and deserialize it here as you serialize it in
     * "serialize" method.
     */
    TreeNode *deserialize(string data) {
        // write your code here
        int pos = 0;
        return readTree(data, pos);
    }

    TreeNode* readTree(string data, int& pos){

        if (data[pos] == ‘#‘){
            pos += 2;
            return NULL;
        }

        int nownum = 0;

        while (data[pos] != ‘ ‘){
            //这里‘ ‘是为了分离不同的数字;
            nownum = nownum * 10 + (data[pos] - ‘0‘);
            pos++;
        }

        pos++;
        TreeNode* nowNode = new TreeNode(nownum);

        nowNode->left = readTree(data, pos);
        nowNode->right = readTree(data, pos);

        return nowNode;
    }
};
时间: 2024-10-08 14:57:04

Lintcode---二叉树的序列化和反序列化的相关文章

lintcode 中等题:binary tree serialization 二叉树的序列化和反序列化

题目 二叉树的序列化和反序列化 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构. 样例 给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构: 3 / 9 20 / 15 7 我们的数据是进行BFS遍历得到的.当你测试结果wrong answer时,你可以作为输

Leetcode 297.二叉树的序列化和反序列化

二叉树地序列化和反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实现二叉树的序列化与反序列化.这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构. 示例:  你可以将以下二叉树: 序列化为 "[1,2,3,null,null,4,5]" 提示: 这与 Le

二叉树的序列化和反序列化(先序,按层序列化),包含递归图

目录 二叉树的序列化与反序列化 按层序列化 使用#!和!的原因: 二叉树的序列化与反序列化 序列化:将对象的状态信息转换为可以存储或传输的形式的过程 二叉树的序列化:就是将二叉树转换成字符串 二叉树的反序列化:通过字符串还原一棵二叉树,返回树的头节点. 先序序列化二叉树 上面这棵树的先序序列化结果为5!3!2!1!#!#!#!4!#!#!8!7!6!#!#!#!10!9!#!#!11!#!#! 从上图中我们可以看出在节点为空的位置使用"#!"来代替,每个节点后的数值都添加一个"

二叉树的序列化和反序列化

http://blog.csdn.net/qq_27703417/article/details/70958692 先序遍历二叉树,如果遇到空节点,就在str的末尾加上"#!","#"表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,"!"表示一个值的结束.如果遇到不为空的节点,假设节点值为3,就在str的末尾加上"3!".现在请你实现树的先序序列化. 先序遍历 import java.util.*; //使用递归

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

一个二叉树被序列化为数组,如何反序列化,也就是如何从序列化好的一个数组恢复成二叉树? 在上一篇文章中讲述了如何将一个有序数组创建成一个二叉搜索树,那么如果将将一个儿茶搜索树序列化为一个有序数组,然后按照上面的方法在反序列化即可.对二叉搜索树进行中序遍历即可得到一个有序的数组,那么上篇文章已经完成了对二叉搜索树的序列化和反序列化.同时如果想将二叉搜索树的序列化和反序列化的结果通过文件读取,也是同样的道理. 设计一个算法,将一棵二叉搜索树(Binary Search Tree,BST)保存到文件中,

二叉树的序列化、反序列化

一. 使用先序遍历的方式 [1]中的方式是采用设定#的方式,当访问读取了#时候,创建null,返回. 二.二叉搜索树的序列化 二叉搜索树具有的有序的性质,可以利用这个性质来递归的反序列化BST 对当前节点要处理的数据的范围设定一个边界,当读取的值是在这个范围里面的时候,则进行node的创建,否则创建NULL节点,对于值的node创建需要递归到上一层递归,寻找新的方案,如果还是不行,以此类推. [1] http://blog.csdn.net/pi9nc/article/details/97016

树(7)-----二叉树的序列化和反序列化

1.序列化:层次遍历[用字符串来存储] 2.反序列化:用队列存已经建立的节点,从序列化后的字符串列表取数来建立树 def serialize(self, root): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ if not root: return "" prev,strres=[root],"" w

leetcode 297二叉树的序列化与反序列化

采用层序遍历的顺序,储存每一层的值,不存在的或者NULL值用#代替,每个位置以'/'结束 /** * 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

Leetcode 297. 二叉树的序列化与反序列化

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ #include <stringstream> class Codec { public: void serialize(TreeNode* root,

序列化与反序列化二叉树

2018-06-16 18:53:36 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.反序列化顾名思义就是通过信息流对对象进行重建的过程. 一般来说序列化和反序列化有如下的作用: 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 3.使程序更具维护性. 本篇文章主要讨论的是二叉树的序列化和反序列化,分别讨论了普通二叉树和二叉搜索树的情况. 一.普通二叉树的序列化和反序列化 问题描述: 问题求解: 序列化和反序列化二叉树本质上