当前位置: 首页 > article >正文

leetcode 297. 二叉树的序列化与反序列化

题目:297. 二叉树的序列化与反序列化 - 力扣(LeetCode)

宽度有限搜索的具象化,没啥难度,注意二叉树中空节点的处理即可。

class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        if (root == nullptr) {
            return "[]";
        }
        vector<TreeNode*> arr;
        arr.push_back(root);
        int i = 0;
        while (i < arr.size()) {
            TreeNode* t = arr[i];
            i++;
            if (!t) {
                continue;
            }
            arr.push_back(t->left);
            arr.push_back(t->right);
        }
        while (arr.size() && arr[arr.size() - 1] == nullptr) {
            arr.pop_back();
        }
        
        string data = "[";
        for (i = 0; i < arr.size(); i++) {
            if (!arr[i]) {
                data += "null";
            } else {
                data += to_string(arr[i]->val);
            }
            if (i < arr.size() - 1) {
                data += ",";
            } else {
                data += "]";
            }
        }
        return data;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        vector<TreeNode*> arr;
        int i = 1;
        int end = data.length() - 2;
        bool neg;
        int val = 0;
        while (i <= end) {
            if (data[i] == 'n') {
                arr.push_back(nullptr);
                i += 5;
                continue;
            }
            neg = false;
            if (data[i] == '-') {
                neg = true;
                i++;
            }
            val = 0;
            while (i <= end && data[i] != ',') {
                val = val * 10 + data[i] - '0';
                i++;
            }
            if (neg) {
                val = - val;
            }
            TreeNode* t = new TreeNode(val);
            arr.push_back(t);
            i++;
        }
        
        if (arr.empty()) {
            return nullptr;
        }
        
        int pid = 0;
        TreeNode* parent;
        for (int i = 1; i < arr.size(); i++) {
            parent = arr[pid];
            if (i % 2 == 1) {
                parent->left = arr[i];
            } else {
                parent->right = arr[i];
                pid++;
                while (!arr[pid]) {
                    pid++;
                }
            }
        }
        return arr[0];
    }
};


http://www.kler.cn/a/457042.html

相关文章:

  • MySQL线上事故:使用`WHERE`条件`!=xxx`无法查询到NULL数据
  • 头歌实训1-1:面向过程编程-基础部分
  • Vue 针对浏览器参数过长实现浏览器参数加密解密
  • 再见2024,你好2025
  • 第 29 章 - ES 源码篇 - 网络 IO 模型及其实现概述
  • ubuntu 使用samba与windows共享文件[注意权限配置]
  • HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口
  • 免费干净!付费软件的平替款!
  • ubuntu 系统资源的查看工具
  • Dockerfile构建SpringBoot镜像并推送到docker公共镜像仓库Docker-hub
  • 电脑缺失“packet.dll”是为什么?如何解决“packet.dll”文件丢失的问题
  • 6、InstructGPT论文笔记(人类反馈指令,对齐)
  • RoboMIND:多体现基准 机器人操纵的智能规范数据
  • 瀚高数据库基础操作
  • 题解:[ABC294G] Distance Queries on a Tree
  • 工作流引擎之Flowable
  • 48.在 Vue 3 中使用 OpenLayers 实现鼠标悬停显示城市名片
  • 《类和对象:基础原理全解析(中篇)》
  • Android-插件化详解
  • 自动化测试-Pytest测试
  • 力扣-数据结构-2【算法学习day.73】
  • 数据结构(哈希表(中)纯概念版)
  • 【ACCSS】2024年亚信安全云认证专家题库
  • Cadence学习笔记 12 PCB初始化设置
  • 【生信圆桌x教程系列】如何安装 seurat V4版本R包
  • vue项目搭建规范