• 【剑指Offer-分解让复杂问题简单化】面试题37:序列化二叉树


    题目描述

    请实现两个函数,分别用来序列化和反序列化二叉树

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

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

    思路

    可以使用先序中序(或中序后序)来保存一棵二叉树,但这种方法要求二叉树中没有重复的元素。事实上,将二叉树按先序序列保存,然后再根结点、左子树、右子树来重建即可。代码如下:

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
        char* Serialize(TreeNode *root) {    
            if(root==nullptr)
                return nullptr;
           
            string str;
            SerializeCore(root, str);
            char* ans = new char[str.length()+1];
            for(int i=0; i<str.length(); i++)
                ans[i] = str[i];
            ans[str.length()+1] = '';
            return ans;
        }
        
        void SerializeCore(TreeNode* root, string& str){
            if(root==nullptr){
                str+='#';
                str+=',';
                return;
            }
            str+=to_string(root->val);
            str+=',';
            SerializeCore(root->left, str);
            SerializeCore(root->right, str);
        }
        
        TreeNode* Deserialize(char *str) {
            if(str==nullptr)
                return nullptr;
            
            TreeNode* root = DeserializeCore(&str);
            return root;
        }
        
        TreeNode* DeserializeCore(char** str){    //因为递归过程中要在序列上移动,所以使用二级指针
            if(**str=='#'){
                (*str)+=2;    //注意这里是+2
                return nullptr;
            }
            
            int val = 0;
            while(**str!=','&&**str!=''){
                val = val*10+((**str)-'0');
                (*str)++;
            }
            TreeNode* root = new TreeNode(val);
            if(**str=='')
                return root;
            else (*str)++;
            root->left = DeserializeCore(str);
            root->right = DeserializeCore(str);
            return root;
        }
    };
    
  • 相关阅读:
    Github访问失败如何解决
    持续交付发布可靠软件的系统方法
    windows上tomcat部署
    软件测试总结
    CentOS cannot find a valid baseurl for repo base/7/x86_64
    姜碧野写给纪中信息学学弟学妹的信
    2022 纪中集训 7.6
    2022 纪中集训7.7
    2022 纪中集训 7.8
    2022 纪中集训 7.11 笔记
  • 原文地址:https://www.cnblogs.com/flix/p/12489285.html
Copyright © 2020-2023  润新知