题目:
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
分析:
这道题会先调序列化函数,然后再根据序列化生成的结果调用反序列化函数,最后和原始输入来对比,所以使用哪种遍历方式都可以,在这里我们使用前序遍历,因为这样序列化得到的结果,最开始就是树的根节点。
C++使用vector来存储节点的值,空指针使用0xFFFFFFFF来表示,在反序列化时遇到0xFFFFFFFF,就可以直接跳过了。
程序:
C++
class Solution { public: char* Serialize(TreeNode *root) { Dlr(root); int *res = new int[a.size()]; for(int i = 0;i < a.size(); i++) res[i] = a[i]; return (char*)res; } TreeNode* Deserialize(char *str) { int *p = (int*) str; return helper(p); } TreeNode* helper(int *&str) { if(*str == 0xFFFFFFFF){ str++; return nullptr; } TreeNode* res = new TreeNode(*str); str++; res->left = helper(str); res->right = helper(str); return res; } void Dlr(TreeNode *root){ if(root == nullptr){ a.push_back(0xFFFFFFFF); return; } a.push_back(root->val); Dlr(root->left); Dlr(root->right); } private: vector<int> a; };
Java
public class Solution { String Serialize(TreeNode root) { if(root == null) return ""; StringBuilder sb = new StringBuilder(); SerializeHelper(root); return string.toString(); } void SerializeHelper(TreeNode root) { if(root == null) { string.append("#,"); return; } string.append(root.val); string.append(','); SerializeHelper(root.left); SerializeHelper(root.right); } TreeNode Deserialize(String str) { if(str.length() == 0) return null; String[] strs = str.split(","); return DeserializeHelper(strs); } TreeNode DeserializeHelper(String[] strs) { if(strs[index].equals("#")){ index++; return null; } TreeNode root = new TreeNode(Integer.parseInt(strs[index])); index++; root.left = DeserializeHelper(strs); root.right = DeserializeHelper(strs); return root; } private StringBuilder string = new StringBuilder(); private int index = 0; }