首页 > 其他分享 >LCR 156. 序列化与反序列化二叉树

LCR 156. 序列化与反序列化二叉树

时间:2024-07-07 14:02:01浏览次数:13  
标签:node TreeNode 二叉树 str LCR 序列化 root vec

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

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

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 1:

在这里插入图片描述
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]

示例 2:
输入:root = []
输出:[]

示例 3:
输入:root = [1]
输出:[1]

示例 4:
输入:root = [1,2]
输出:[1,2]

提示:

  • 树中结点数在范围 [0, 104] 内
  • -1000 <= Node.val <= 1000

思路:
序列化:
1、按照层次遍历顺序收集每个节点的val,并追加到str;
2、遍历完毕之后,注意将str最后一个逗号删除。

反序列化:
1、将序列化的字符串以分隔符“,”进行切分,切分之后生成一个节点,存放在vector中;
2、以vector[0]为根节点,按照层次遍历的顺序,将节点插入以vector[0]为根节点的这棵树中。

/**
 * 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:

    // Encodes a tree to a single string.
string serialize(TreeNode* root) {
	//层次遍历
	string str = "";
	queue<TreeNode*> que;
	if (root==nullptr){
		return "null";
	}
	que.push(root);
	while (!que.empty()){
		TreeNode *node = que.front(); que.pop();
		
		if (node == nullptr){
			str += "null,";
		}
		else {
			str += to_string(node->val);
			str += ",";
			que.push(node->left);
			que.push(node->right);
		}
	}
	//str多了最后一个,
	str.pop_back();
    cout<<str<<endl;
	return str;
}

// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
	//数据切分
	vector<TreeNode*> vec;
	int len = data.length(),i=0;
	string str = "";
	while (i <= len-1){
		string tem = "";
		while(i<len && data[i] != ',') {
			tem += data[i++];
		}
        cout<<tem;
		if (tem == "null"){
			TreeNode* node = nullptr;
			vec.push_back(node);
		}
		else {
			TreeNode* node = new TreeNode(stoi(tem));
			vec.push_back(node);
		}
        i++;//移动到下一个位置
	}
	//以层次遍历的方式构造二叉树
	for (int i = 0,j = 1; j < vec.size(); i++){
		if (vec[i]==nullptr) continue;
		if (j < vec.size()) vec[i]->left = vec[j++];
		if (j < vec.size()) vec[i]->right = vec[j++];
	}
	return vec[0];//返回树的根
}
};

// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));

标签:node,TreeNode,二叉树,str,LCR,序列化,root,vec
From: https://blog.csdn.net/weixin_44720592/article/details/140245328

相关文章

  • 数据结构——二叉树相关题目
    1.寻找二叉树中数值为x的节点//寻找二叉树中数值为x的节点BTNode*TreeFind(BTNode*root,BTDataTypex)//传过来二叉树的地址和根的地址,以及需要查找的数据{ if(root==Null) { returnNull; }//首先需要先判断这个树是否为空,如果为空直接返回空 if(root->data=......
  • Java反射与Fastjson的危险反序列化
    Preface在前文中,我们介绍了Java的基础语法和特性和fastjson的基础用法,本文我们将深入学习fastjson的危险反序列化以及预期相关的Java概念。什么是Java反射?在前文中,我们有一行代码ComputermacBookPro=JSON.parseObject(preReceive,Computer.class);这行代码是什么意......
  • leetcode 257. 二叉树的所有路径
    给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。 示例1:输入:root=[1,2,3,null,5]输出:["1->2->5","1->3"]示例2:输入:root=[1]输出:["1"]java解题思路及代码实现递归法packagecom.java......
  • leetcode 102. 二叉树的层序遍历
    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]提示:树中节点数目在范围 [0,2000] ......
  • 二叉树的顺序存储
    目录顺序存储:简介:节点的位置关系:优缺点:优点:缺点:二叉树顺序存储的模拟实现:向上调整算法:向下调整算法:二叉树的初始化:直接初始化:建堆初始化:二叉树的头删:二叉树的尾插:二叉树的取顶端元素:二叉树的判空:二叉树的销毁:完整代码:顺序存储:简介:顺序结构存储就是使......
  • 代码随想录day15 平衡二叉树 | 二叉树的所有路径 | 左叶子之和 | 完全二叉树的节点个
    平衡二叉树平衡二叉树解题思路二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。这道题由于需要求节点的高度差来进行判断,因此我们需要用后序遍历,先左右,后中间。推荐使用递归把每个节点的高度算出来......
  • 代码随想录算法训练营第十五天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之
    110平衡二叉树1classSolution{2public:3intGetHeight(TreeNode*root){4if(!root){5return0;6}7intleftHeight=GetHeight(root->left);8if(leftHeight==-1)ret......
  • python数据结构(树和二叉树)
    树非线性结构一对多根结点(无前驱)多个叶子结点(无后继)其他数据元素(一个前驱,多个后驱)树与二叉树转换树与二叉树均可用二叉链表作为存储结构,则以二叉链表为媒介可导出树之间的一个对应关系-----即给定一颗树,可以找到唯一一颗二叉树与之对应。把树转化为二叉树步骤一:加线......
  • 代码随想录算法训练营第十四天| 226.翻转二叉树 、101. 对称二叉树、104.二叉树的最大
    二叉树学习2226题翻转二叉树,改一下前序递归遍历,每次遍历的时候都调换一下左右结点即可。classSolution{public:voidpreorder(TreeNode*root){if(root==nullptr){return;}TreeNode*tmp;tmp=root->left;......
  • PHP反序列化字符逃逸详解
    这段时间遇到几个关于反序列化的字符逃逸的程序,今天来分享一下经验。<?phpfunctionfilter($str){returnstr_replace('bb','ccc',$str);}classA{public$name='aaaa';public$pass='123456';}$AA=newA();$res=filter(serialize($AA));$c=unserial......