LeetCode(算法)- 297. 二叉树的序列化与反序列化
题目链接:点击打开链接
题目大意:略
解题思路:略
相关企业
- 亚马逊(Amazon)
- 微软(Microsoft)
- 谷歌(Google)
- 英伟达(NVIDIA)
- 优步(Uber)
- 苹果(Apple)
- 甲骨文(Oracle)
AC 代码
- Java
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));// 解决方案(1)
public class Codec {public String serialize(TreeNode root) {StringBuilder sb = new StringBuilder();Queue<TreeNode> queue = new LinkedList<TreeNode>(){{offer(root);}};while (!queue.isEmpty()) {TreeNode node = queue.poll();if (node == null) {sb.append(Integer.MAX_VALUE).append("#");continue;}sb.append(node.val).append("#");queue.offer(node.left);queue.offer(node.right);}return sb.toString();}public TreeNode deserialize(String data) {String[] arr = data.split("#");int ptrPar = arr.length - 1, ptrSub = arr.length - 1;Map<Integer, TreeNode> nodeMap = new HashMap<>();Map<TreeNode, TreeNode> parLMap = new HashMap<>();Map<TreeNode, TreeNode> parRMap = new HashMap<>();boolean flag = true;while (ptrPar >= 0) {// 定位父亲指针while (arr[ptrPar].equals(String.valueOf(Integer.MAX_VALUE))) {ptrPar--;}// 生成父节点TreeNode parNode = new TreeNode(Integer.valueOf(arr[ptrPar]));nodeMap.put(ptrPar--, parNode);// 生成儿子节点TreeNode lNode, rNode;if (nodeMap.containsKey(ptrSub)) {rNode = nodeMap.get(ptrSub);} else {Integer arrValue = Integer.valueOf(arr[ptrSub]);rNode = new TreeNode(arrValue);if (!arrValue.equals(Integer.MAX_VALUE)) {flag = false;}if (flag) {parRMap.put(rNode, parNode);}}ptrSub--;if (nodeMap.containsKey(ptrSub)) {lNode = nodeMap.get(ptrSub);} else {Integer arrValue = Integer.valueOf(arr[ptrSub]);lNode = new TreeNode(arrValue);if (!arrValue.equals(Integer.MAX_VALUE)) {flag = false;}if (flag) {parLMap.put(lNode, parNode);}}ptrSub--;// 组合节点parNode.right = rNode;parNode.left = lNode;}// 满二叉树转换完全二叉树(去除末尾的 NULL)convertTree(parLMap, parRMap);return nodeMap.get(0);}private void convertTree(Map<TreeNode, TreeNode> parLMap, Map<TreeNode, TreeNode> parRMap) {for (Map.Entry<TreeNode, TreeNode> item : parLMap.entrySet()) {item.getValue().left = null;}for (Map.Entry<TreeNode, TreeNode> item : parRMap.entrySet()) {item.getValue().right = null;}}
}// 解决方案(2)
public class Codec {public String serialize(TreeNode root) {if(root == null) return "[]";StringBuilder res = new StringBuilder("[");Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }};while(!queue.isEmpty()) {TreeNode node = queue.poll();if(node != null) {res.append(node.val + ",");queue.add(node.left);queue.add(node.right);}else res.append("null,");}res.deleteCharAt(res.length() - 1);res.append("]");return res.toString();}public TreeNode deserialize(String data) {if(data.equals("[]")) return null;String[] vals = data.substring(1, data.length() - 1).split(",");TreeNode root = new TreeNode(Integer.parseInt(vals[0]));Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }};int i = 1;while(!queue.isEmpty()) {TreeNode node = queue.poll();if(!vals[i].equals("null")) {node.left = new TreeNode(Integer.parseInt(vals[i]));queue.add(node.left);}i++;if(!vals[i].equals("null")) {node.right = new TreeNode(Integer.parseInt(vals[i]));queue.add(node.right);}i++;}return root;}
}
- C++
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));class Codec {
public:// Encodes a tree to a single string.string serialize(TreeNode* root) {if(root == nullptr) return "[]";string res = "[";queue<TreeNode*> que;que.emplace(root);while(!que.empty()) {TreeNode* node = que.front();que.pop();if(node != nullptr) {res += (to_string(node->val) + ",");que.emplace(node->left);que.emplace(node->right);}else res += "null,";}res.pop_back();res += "]";return res;}// Decodes your encoded data to tree.TreeNode* deserialize(string data) {if (data == "[]")return nullptr;vector<string> list = split(data.substr(1, data.length() - 2), ",");TreeNode *root = new TreeNode(std::stoi(list[0]));queue<TreeNode*> que;que.emplace(root);int i = 1;while(!que.empty()) {TreeNode *node = que.front();que.pop();if(list[i] != "null") {node->left = new TreeNode(std::stoi(list[i]));que.emplace(node->left);}i++;if(list[i] != "null") {node->right = new TreeNode(std::stoi(list[i]));que.emplace(node->right);}i++;}return root;}private:// Split a str by a delimvector<string> split(string str, string delim) {vector<string> list;int i = 0, j = 0, len = str.length();while (i < len) {while (j < len && str[j] != ',')j++;list.push_back(str.substr(i, j - i));i = ++j;}return list;}
};
LeetCode(算法)- 297. 二叉树的序列化与反序列化相关推荐
- leetcode第297——二叉树的序列化与反序列化(层次遍历)
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 1.需求 请设计一个算法 ...
- leetcode:297. 二叉树的序列化与反序列化
题目来源 leetcode 题目描述 . struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), le ...
- Java实现 LeetCode 297 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得 ...
- 【leetcode】二叉树,297二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 前言 题目难度:困难 一.题目描述 二.前序遍历解法 三.后序遍历解法 四.中序遍历解法 五.层级遍历解法 前言 如果你看过下面这几篇,那这道题应该对你来说信手拈来 ...
- LeetCode 297. 二叉树的序列化与反序列化 | Python
文章目录 297. 二叉树的序列化与反序列化 题目 解题思路 代码实现 实现结果 总结 297. 二叉树的序列化与反序列化 题目来源:力扣(LeetCode)https://leetcode-cn.c ...
- 【LeetCode】【HOT】297. 二叉树的序列化与反序列化(BFS)
[LeetCode][HOT]297. 二叉树的序列化与反序列化 文章目录 [LeetCode][HOT]297. 二叉树的序列化与反序列化 package hot;import java.util. ...
- LeetCode Java刷题笔记—297. 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 请实现两个函数,分别用来序列化和反序列化二叉树.这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化 ...
- golang力扣leetcode 297.二叉树的序列化与反序列化
297.二叉树的序列化与反序列化 297.二叉树的序列化与反序列化 题解 代码 297.二叉树的序列化与反序列化 297.二叉树的序列化与反序列化 题解 题目:给你一个二叉树,序列化从一个string ...
- 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树
数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡而二叉树 目录 二叉树的序列化和反序列化 判断一棵树是否为平衡而二叉树 1. 二叉树的序列化和反序列化 1. 递归版本序列化和反序列化 代 ...
- LeetCode 297. 二叉树的序列化与反序列化(前序遍历层序遍历)
文章目录 1. 题目 2. 解题 2.1 前序遍历 2.2 层序遍历 1. 题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过 ...
最新文章
- Linux服务器默认建立的LVM逻辑卷磁盘空间分配不合理,根目录不够用,如何缩减和扩展逻辑卷?...
- 第一章 1 常用库之time
- Python 学习第十六天 html 前端内容总结
- 好端端的程序员,咋就成了新生代农民工!
- jquerymobile应用中session、cookie
- 怎么卸载apowerrec_如何删除windows10自带应用
- 机械革命深海泰坦X1(1050T)触控板用不了三指
- 外媒:巴基斯坦将成为南亚地区首个测试5G通讯的国家
- Java将一个正整数进行因数分解
- linux valgrind 编译,valgrind 3.9交叉编译
- mysql怎么查看记录时间戳_mysql TIMESTAMP(时间戳)详解——查询最近一段时间操作的记录...
- Activiti reassign task to another user
- 已经开工三天的软件测试工程师:被女足和谷爱凌感动到了
- 雷神众测开启团队竞赛模式
- 003. 电话号码的字母组合——回溯算法
- WebRTC源码中turnserver的使用方法
- 面试必备之深入理解自旋锁
- 在Firefox安装selenium
- linux 无法获得磁盘信息,Linux 磁盘无法umount
- 我不杀伯仁,伯仁却因我而死