本文主要是介绍297. 二叉树的序列化与反序列化-H,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
297. 二叉树的序列化与反序列化-H
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1/ \2 3/ \4 5
序列化为 “[1,2,3,null,null,4,5]”
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
分析:
- 怎么遍历树序列化,怎么反序列化,这里用NLR递归的方式进行序列化,反序列化时,正好先解析出来的是头,接着递归两次解析到左右孩子,这样递归下去即可。从结果看效率不是最高的,因为要进行递归调用。
- 若按层遍历,则直接在一个循环里解决了。
- 注意每个元素分割符号,空节点符号,以及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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!