297. 二叉树的序列化与反序列化-H

2023-11-05 00:48
文章标签 二叉树 序列化 297

本文主要是介绍297. 二叉树的序列化与反序列化-H,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

297. 二叉树的序列化与反序列化-H

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例:

你可以将以下二叉树:

    1/ \2   3/ \4   5

序列化为 “[1,2,3,null,null,4,5]”
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

分析:

  1. 怎么遍历树序列化,怎么反序列化,这里用NLR递归的方式进行序列化,反序列化时,正好先解析出来的是头,接着递归两次解析到左右孩子,这样递归下去即可。从结果看效率不是最高的,因为要进行递归调用。
  2. 若按层遍历,则直接在一个循环里解决了。
  3. 注意每个元素分割符号,空节点符号,以及to_string和atoi(string.c_str());golang的strconv.Atoi()和strconv.Itoa()
/*
执行用时 :528 ms, 在所有 C++ 提交中击败了5.12%的用户
内存消耗 :715.9 MB, 在所有 C++ 提交中击败了5.27%的用户
*/
#include<iostream>
#include<stack>
#include<vector>
using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}};
// Encodes a tree to a single string.
string serialize(TreeNode* root) {if(root==NULL){return "#";}return to_string(root->val)+","+serialize(root->left)+","+serialize(root->right);
}
//1,2,#,#,3,4,#,#,5,#,#
TreeNode* toNode(string data,int& i){TreeNode*node=NULL;string tmp;while(i<data.size()){if(data[i]==','){node=new TreeNode(atoi(tmp.c_str()));i++;break;}else if(data[i]=='#'){//#,i+=2;return NULL;}else{tmp=tmp+data[i];i++;}}if(node==NULL)return NULL;node->left=toNode(data,i);node->right=toNode(data,i);return node;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {int idx=0;return toNode(data,idx);
}
void NLR(TreeNode*node){if(node==NULL)return;cout<<node->val<<" ";NLR(node->left);NLR(node->right);
}
int main(){TreeNode h1(1);TreeNode h2(2);TreeNode h3(3);TreeNode h4(4);TreeNode h5(5);h1.left=&h2;h1.right=&h3;h2.left=&h4;h2.right=&h5;string tmp=serialize(&h1);cout<<tmp<<endl;TreeNode* node=deserialize(tmp);NLR(node);cout<<endl;return 0;
}

这篇关于297. 二叉树的序列化与反序列化-H的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/346287

相关文章

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

Python---文件IO流及对象序列化

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 前文模块中提到加密模块,本文将终点介绍加密模块和文件流。 一、文件流和IO流概述         在Python中,IO流是用于输入和输出数据的通道。它可以用于读取输入数据或将数据写入输出目标。IO流可以是标准输入/输出流(stdin和stdout),也可以是文件流,网络流等。

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

jquery 表单序列化

jQuery序列化表单的方法总结 现在这里贴出案例中静态的html网页内容: <!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><title>Title</title><script src="../js/jquery-3.2.1.js"></script></head><body><form method="post"

Java反序列化漏洞-TemplatesImpl利用链分析

文章目录 一、前言二、正文1. 寻找利用链2. 构造POC2.1 生成字节码2.2 加载字节码1)getTransletInstance2)defineTransletClasses 2.3 创建实例 3. 完整POC 三、参考文章 一、前言 java.lang.ClassLoader#defineClass defineClass可以加载字节码,但由于defineClas

Spring之——整合Redis序列化方式StringRedisSerializer、FastJsonRedisSerializer和KryoRedisSerializer

当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。 Spring Data JPA为我们提供了下面的Serializ

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

222.完全二叉树的节点个数

(写给未来遗忘的自己) 题目: 代码: class Solution {public:int countNodes(TreeNode* root) {queue<TreeNode*>node_que;if(root==nullptr) return 0;node_que.push(root);int result;while(!node_que.empty()){int layer_s