Skip to content

Commit 579c768

Browse files
Add C++ implementation
Signed-off-by: begeekmyfriend <begeekmyfriend@gmail.com>
1 parent a90b53d commit 579c768

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
all:
2+
gcc -O1 -o test tree_serdes.c
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include <stdbool.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include <string.h>
5+
6+
7+
struct TreeNode {
8+
int val;
9+
struct TreeNode *left;
10+
struct TreeNode *right;
11+
};
12+
13+
static void ser(struct TreeNode *root, char **str, int *len) {
14+
if (root == NULL) {
15+
(*str)[(*len)++] = '#';
16+
(*str)[(*len)++] = ',';
17+
} else {
18+
int v = root->val;
19+
if (v < 0) {
20+
v = -v;
21+
(*str)[(*len)++] = '-';
22+
}
23+
while (v > 0) {
24+
(*str)[(*len)++] = v % 10 + '0';
25+
v /= 10;
26+
}
27+
(*str)[(*len)++] = ',';
28+
ser(root->left, str, len);
29+
ser(root->right, str, len);
30+
}
31+
}
32+
33+
static struct TreeNode *des(char **str) {
34+
if (**str == '\0') {
35+
return NULL;
36+
}
37+
if (**str == '#') {
38+
(*str)++;
39+
(*str)++;
40+
return NULL;
41+
}
42+
43+
int i;
44+
bool sign = false;
45+
struct TreeNode *node = malloc(sizeof(struct TreeNode));
46+
node->val = 0;
47+
if (**str == '-') {
48+
sign = true;
49+
(*str)++;
50+
}
51+
for (i = 1; **str != ','; i *= 10) {
52+
node->val += i * ((**str) - '0');
53+
(*str)++;
54+
}
55+
if (sign) {
56+
node->val = -node->val;
57+
}
58+
(*str)++;
59+
node->left = des(str);
60+
node->right = des(str);
61+
return node;
62+
}
63+
64+
/** Encodes a tree to a single string. */
65+
char* serialize(struct TreeNode* root) {
66+
int len = 0;
67+
char *str = malloc(40000);
68+
memset(str, '\0', 40000);
69+
ser(root, &str, &len);
70+
return str;
71+
}
72+
73+
/** Decodes your encoded data to tree. */
74+
struct TreeNode* deserialize(char* data) {
75+
return des(&data);
76+
}
77+
78+
int main(void)
79+
{
80+
struct TreeNode root;
81+
root.val = 3;
82+
83+
struct TreeNode node1[2];
84+
node1[0].val = 9;
85+
node1[1].val = 20;
86+
87+
struct TreeNode node2[4];
88+
node2[2].val = 15;
89+
node2[3].val = 7;
90+
91+
root.left = &node1[0];
92+
root.right = &node1[1];
93+
94+
node1[0].left = NULL;
95+
node1[0].right = NULL;
96+
node1[1].left = &node2[2];
97+
node1[1].right = &node2[3];
98+
99+
node2[0].left = NULL;
100+
node2[0].right = NULL;
101+
node2[1].left = NULL;
102+
node2[1].right = NULL;
103+
node2[2].left = NULL;
104+
node2[2].right = NULL;
105+
node2[3].left = NULL;
106+
node2[3].right = NULL;
107+
108+
/* Your functions will be called as such */
109+
char* data = serialize(&root);
110+
printf("%s\n", data);
111+
deserialize(data);
112+
113+
return 0;
114+
}

0 commit comments

Comments
 (0)