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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
#define N 1010
using namespace std;
class Solution { public:
string tree_seri; int pr_or[N], in_or[N]; int cnt;
void set(int num) { if (!num) return; set(num / 10); if (num < 0) num *= -1; tree_seri += num % 10 + '0'; }
void order(TreeNode* root, bool pre) { if (!root) return;
if (!pre) order(root -> left, pre);
int &v = root -> val; if (!v) tree_seri += '0'; else { if (v < 0) tree_seri += '-'; set(v); } tree_seri += ",";
if (pre) order(root -> left, pre);
order(root -> right, pre); }
string serialize(TreeNode* root) {
if (!root) return "";
order(root, true); tree_seri[tree_seri.size() - 1] = '|'; order(root, false); tree_seri[tree_seri.size() - 1] = '\0';
return tree_seri; }
void arr_set(int begin, int end, int arr[]) { bool neg = false; for (int i = begin; i < end; ++ i) { if (tree_seri[i] == ',') continue; if (tree_seri[i] == '-') { neg = true; continue; }
int sum = 0; while (tree_seri[i] >= '0' && tree_seri[i] <= '9') { sum += tree_seri[i] - '0'; sum *= 10; ++ i; } -- i;
if (neg) sum *= -1, neg = false; arr[cnt ++] = sum / 10; } }
map<int,int> hash;
TreeNode* dfs(int pl, int pr, int il, int ir) { if (pl > pr) return nullptr; auto *root = new TreeNode(pr_or[pl]); int k = hash[pr_or[pl]]; root -> left = dfs(pl + 1, pl + k - il, il, k - 1); root -> right = dfs(pl + k - il + 1, pr, k + 1, ir); return root; }
TreeNode* deserialize(string data) {
if (data == "") return nullptr;
tree_seri = data;
int begin = 0, end = 0; while (data[end] != '|') ++ end;
arr_set(begin, end, pr_or); cnt = 0; arr_set(end + 1, data.size() - 1, in_or);
for (int i = 0; i < cnt; ++ i) hash[in_or[i]] = i; return dfs(0, cnt - 1, 0, cnt - 1); } };
|