• 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));
    
  • 相关阅读:
    Laravel框架中的event事件操作
    PHP魔术方法实例
    PHP 面向对象
    ThinkPHP中where()使用方法详解
    PHP常见错误提示含义解释
    php面向对象编程self和static的区别
    php文件路径获取文件名
    php三种无限分类
    php高精度计算问题
    转:JavaScript定时机制、以及浏览器渲染机制 浅谈
  • 原文地址:https://www.cnblogs.com/linrj/p/13573195.html
Copyright © 2020-2023  润新知