一、前言
本系列文章为《剑指Offer》刷题笔记。
刷题平台:牛客网
书籍下载:共享资源
二、题目
请实现两个函数,分别用来序列化和反序列化二叉树。
1、思路
这道题思路简单,使用前序遍历来序列化和发序列化即可。只要自己写的程序格式对应上即可。可以使用$符号表示NULL,同时每个结点之间,需要添加逗号,即','进行分隔。
直接看代码即可。
2、代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: char* Serialize(TreeNode *root) { if(!root){ return NULL; } string str; SerializeCore(root, str); // 把str流中转换为字符串返回 int length = str.length(); char* res = new char[length+1]; // 把str流中转换为字符串返回 for(int i = 0; i < length; i++){ res[i] = str[i]; } res[length] = '\0'; return res; } TreeNode* Deserialize(char *str) { if(!str){ return NULL; } TreeNode* res = DeserializeCore(&str); return res; } void SerializeCore(TreeNode* root, string& str){ // 如果指针为空,表示左子节点或右子节点为空,则在序列中用#表示 if(!root){ str += '#'; return; } string tmp = to_string(root->val); str += tmp; // 加逗号,用于区分每个结点 str += ','; SerializeCore(root->left, str); SerializeCore(root->right, str); } // 递归时改变了str值使其指向后面的序列,因此要声明为char** TreeNode* DeserializeCore(char** str){ // 到达叶节点时,调用两次,都返回null,所以构建完毕,返回父节点的构建 if(**str == '#'){ (*str)++; return NULL; } // 因为整数是用字符串表示,一个字符表示一位,先进行转换 int num = 0; while(**str != ',' && **str != '\0'){ num = num * 10 + ((**str) - '0'); (*str)++; } TreeNode* root = new TreeNode(num); if(**str == '\0'){ return root; } else{ (*str)++; } root->left = DeserializeCore(str); root->right = DeserializeCore(str); return root; } }; |
微信公众号
分享技术,乐享生活:微信公众号搜索「JackCui-AI」关注一个在互联网摸爬滚打的潜行者。
2019年9月18日 下午4:46 沙发
想问一个问题,这里什么时候Public什么时候private,我看之前有人提到private是为了设置成全局变量?这和我理解只为了封装不太一样。
2019年9月19日 上午9:30 1层
@云海玉弓 private是指类的内部变量或者函数是私有的,外部函数无法调用。public是公共的,都能调用。