zoukankan      html  css  js  c++  java
  • 剑指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;
    }
  • 相关阅读:
    SM2实现(利用openssl的evp)
    BouncyCastle的SM实践
    初步动态分析
    信安保障复习
    数据库实验3
    软件测试之测试用例设计题
    Spring SPI 机制总结
    Servlet与Netty横向对比
    被遮挡部分高亮
    (十一)Android环境变量设置
  • 原文地址:https://www.cnblogs.com/silentteller/p/12115563.html
Copyright © 2011-2022 走看看