• LeetCode297. 二叉树的序列化与反序列化


    将二叉树先序遍历解码为一个序列字符串s,不同的数字之间用逗号分隔,如果遇到空节点,就只在s加上一个","。
    如果不是空节点,就先加上当前节点的值,然后再加上逗号。

    解码的时候,也是取两个逗号之间的值,如果逗号之间为空,则说明是空节点,否则new一个TreeNode出来,节点的值就是两个逗号之间的
    子串的值转为int。

    代码如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Codec {
    public:
        void encode(TreeNode* root, string &s) {
            if(root == NULL) {                                    // 空节点在序列化的时候只加上一个逗号
                s += ",";
                return ;
            }
            s += to_string(root -> val) + ",";                    // 非空节点在序列化的时候先加上节点值再加上逗号
            encode(root -> left, s);                              // 先序遍历序列化二叉树
            encode(root -> right, s);
        }
    
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {                  
            string s;                              
            encode(root, s);                                      // 序列化编码的结果记录在字符串s里
            return s;
        }
    
        TreeNode* decode(string &s, int &cur) {                   // 从字符串s反序列化二叉树,cur是当前解码的字符在字符串s中的下标,这里注意s和cur必须是引用
            if(s[cur] == ',') {                                   // 如果两个逗号之间什么也没有,说明是空节点
                ++cur;
                return NULL;
            }
            int end = cur;                                        // end记录下一个逗号的位置
            while(end < s.size() && s[end] != ',') {
                ++end;
            }
            TreeNode* root = new TreeNode(stoi(s.substr(cur, end - cur)));     // 两个逗号之间的子串的值转为int就是当前节点的值
            cur = end + 1;                                         // cur从下一个逗号的下一个位置开始解码
            root -> left = decode(s, cur);                         // 先序遍历解码字符串s
            root -> right = decode(s, cur);
            return root;
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            int cur = 0;                                          // 从要解码的字符串的第0个字母开始解码
            TreeNode* root = decode(data, cur);                    
            return root;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));
    
  • 相关阅读:
    angular中transclude的理解
    node express中使用static的错误
    待研究———node中使用session时的id不断更改问题
    node 中mongoose使用validate和密码加密的问题
    exports 和 module.exports 的区别
    node.js开发错误——DeprecationWarning: Mongoose: mpromise
    Mongoose全面理解
    【js】JSON.stringify 语法实例讲解
    springboot+mybatis使用PageHelper分页
    连接mysql提示Establishing SSL connection without server's identity verification is not recommended错误
  • 原文地址:https://www.cnblogs.com/linrj/p/13573195.html
Copyright © 2020-2023  润新知