二叉树序列化和反序列化

来源:互联网 发布:淘宝客户分类管理 编辑:程序博客网 时间:2024/06/11 13:18

二叉树按层遍历:

1. 针对二叉树的宽度优先遍历(图的宽度优先搜索的一个应用)

2. 宽度优先遍历常使用队列结构。

3. 通常对换行有所要求。


案例一:给定一课二叉树的头节点head,请按照层打印这棵数,一层一层打印,相邻两层之间需要换行。

用last和nlast,last表示正在打印的当前行的最右节点,nlast为下一行的最右节点。

先将队列中节点弹出,然后打印,然后将它的左右孩子进入队列,然后判断这个节点是不是last,如果是的话

就换行,将last=nlast,进行下一行的打印。

案例二:二叉树的序列化和反序列化

用文件将二叉树的结构记录下来,下一次向重构二叉树的时候根据文件中的记录就可以将二叉树还原出来;

将二叉树记录成文件的过程叫做二叉树序列化过程或者持久化过程;

将文件中的记录还原成二叉树的过程,反序列化过程。

序列化的方式:

1. 根据先序遍历序列化

2. 根据中序遍历序列化

3. 根据后序遍历序列化

4.按层序列化

案例三:给定一棵二叉树的头节点head,并已知二叉树节点值的类型为32位整型,请设计一种二叉树序列化和反序列化的方案,并用代码实现。

这里的序列化是将二叉树保存在字符串中,因此需要用!等特殊字符表示一个节点值的结束!!!否则容易引起歧义!!比如,假如节点值为12,那么

保存到字符串中如果没有!就不知道是12还是1和2。所以为了避免这种歧义要用!表示结束。但是如果并不是保存在字符串中,而是保存到数组中,

就不需要了。

用先序遍历方式序列化:(中序和后序类似,不多说)

1. 假设序列化结果为str,初始时str为空字符串。

2.先序遍历二叉树的时候如果遇到空节点,在str末尾加上“#!”。

3. 如果遇到不为空的节点,假设节点值为3.就在str的末尾加上“3!”。




/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/


class TreeToString {
public:
    string toString(TreeNode* root) {
        // write code here
        string result;
        //非递归方式进行先序遍历
        convert(root,result);
        return result;
    }
    void convert(TreeNode* root,string& result){
        if(root!=NULL){
            result+=to_string(root->val);
            result+='!';
            convert(root->left,result);
            convert(root->right,result);
        }else{
            result+="#!";
            return;
        }
    }
};

上面是按照先序遍历的方式将二叉树序列化,使用的是递归的方式!!需要注意的是,在向string类型的result后面追加整型的时候,不能直接用‘+’,因为

C++中string只支持字符或字符串相加:

string& operator+= ( const string& str );
string& operator+= ( const char* s ); 
string& operator+= ( char c );

所以,必须将int类型转换成为string类型,具体的方式有两种,可以参考http://blog.csdn.net/chavo0/article/details/51038397。

一棵二叉树通过先序遍历得到的结果,如何进行反序列化。

方法:将结果字符串string先转换成字符串数组,这个过程中去掉了string中的!特殊字符,数组代表二叉树先序遍历的顺序。


1.选择用什么方式序列化,就用什么方式反序列化。

2.一棵树序列化的结果是唯一的,唯一的结果生成的二叉树也是唯一的。


按层遍历的方式对二叉树进行序列化

1. 用队列来进行二叉树的按层遍历,即宽度优先遍历。

2. 除了访问节点的书序是按层遍历之外,对结果字符串的处理,与之前介绍的处理方式一样。

3. 反序列化过程同理。

原创粉丝点击