剑指Offer-61.序列化二叉树(C++/Java)

题目:

请实现两个函数,分别用来序列化和反序列化二叉树
 
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

分析:

这道题会先调序列化函数,然后再根据序列化生成的结果调用反序列化函数,最后和原始输入来对比,所以使用哪种遍历方式都可以,在这里我们使用前序遍历,因为这样序列化得到的结果,最开始就是树的根节点。

C++使用vector来存储节点的值,空指针使用0xFFFFFFFF来表示,在反序列化时遇到0xFFFFFFFF,就可以直接跳过了。

程序:

C++

class Solution {
public:
    char* Serialize(TreeNode *root) {   
        Dlr(root);
        int *res = new int[a.size()];
        for(int i = 0;i < a.size(); i++) 
            res[i] = a[i];
        return (char*)res;
    }
    TreeNode* Deserialize(char *str) {
        int *p = (int*) str;
        return helper(p);
    }
    TreeNode* helper(int *&str) {
        if(*str == 0xFFFFFFFF){
            str++;
            return nullptr;
        }
        TreeNode* res = new TreeNode(*str);
        str++;
        res->left = helper(str);
        res->right = helper(str);
        return res;
    }
    void Dlr(TreeNode *root){
        if(root == nullptr){
            a.push_back(0xFFFFFFFF);
            return;
        }
        a.push_back(root->val);
        Dlr(root->left);
        Dlr(root->right);
    }
private:
    vector<int> a;
};

Java

public class Solution {
    String Serialize(TreeNode root) {
        if(root == null)
            return "";
        StringBuilder sb = new StringBuilder();
        SerializeHelper(root);
        return string.toString();
    }
    void SerializeHelper(TreeNode root) {
        if(root == null) {
            string.append("#,");
            return;
        }
        string.append(root.val);
        string.append(',');
        SerializeHelper(root.left);
        SerializeHelper(root.right);
    }
    TreeNode Deserialize(String str) {
       if(str.length() == 0)
            return null;
        String[] strs = str.split(",");
        return DeserializeHelper(strs);
    }
    TreeNode DeserializeHelper(String[] strs) {
        if(strs[index].equals("#")){
            index++;
            return null;
        }
        TreeNode root = new TreeNode(Integer.parseInt(strs[index]));
        index++;
        root.left = DeserializeHelper(strs);
        root.right = DeserializeHelper(strs);
        return root;
    }
    private StringBuilder string = new StringBuilder();
    private int index = 0;
}

猜你喜欢

转载自www.cnblogs.com/silentteller/p/12115563.html