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;
    }
  • 相关阅读:
    在Power BI报表和仪表板中显示刷新日期时间
    微软Power BI 每月功能更新系列——12月Power BI 新功能学习
    在Microsoft Power BI中创建地图的10种方法
    您应该将报表从Excel转换为Power BI的8个原因
    OBS录制全屏游戏的方法(超好录屏)
    关于Adobe Premiere Pro视音频不同步的解决方法
    Npcap:Nmap项目里一个为Windows而生的嗅探库 Npcap: Nmap Project's packet sniffing library for Windows
    关于被malloc分配内存的指针
    VS2017 高级使用方法
    Npcap环境配置(Winpcap后继者) pcap的一种
  • 原文地址:https://www.cnblogs.com/silentteller/p/12115563.html
Copyright © 2011-2022 走看看