请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
- 前序,但空节点输出空字符
- 要求
char*
,考虑reinterpret_cast<char*>(int*)
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 74 75 76 77
|
class Solution { public: int d[65535]; const int EMPTY = numeric_limits<int>::max(); char* Serialize(TreeNode *root) { if (root == nullptr) { return nullptr; } else { stack<TreeNode*> s; s.push(root); for (int i = 0; s.size() > 0; i++) { TreeNode *n = s.top(); s.pop(); if (n == nullptr) { d[i] = EMPTY; } else { d[i] = n->val; s.push(n->right); s.push(n->left); } } return reinterpret_cast<char*>(d); } } TreeNode* Deserialize(char *str) { int *dd = reinterpret_cast<int*>(str); if (str == nullptr || *dd == EMPTY) { return nullptr; } else { TreeNode *root = new TreeNode(*dd); stack<TreeNode*> s; s.push(root); for (int i = 1; s.size() > 0; i++) { for (int lvalue; (lvalue = dd[i]) != EMPTY; i++) { TreeNode *lchild = new TreeNode(lvalue); s.top()->left = lchild; s.push(lchild); } i++; for (int rvalue; s.size() > 0 && (rvalue = dd[i]) == EMPTY; i++) { s.pop(); } if (s.size() > 0) { TreeNode *rchild = new TreeNode(dd[i]); s.top()->right = rchild; s.pop(); s.push(rchild); } } return root; } } };
|