Skip to content

Commit 9dc84fd

Browse files
committed
feat(soobing): week12 > serialize-and-deserialize-binary-tree
1 parent cb5c320 commit 9dc84fd

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/**
2+
* 문제 설명
3+
* - 이진 트리를 직렬화/역직렬화 하는 문제
4+
*
5+
* 아이디어
6+
* 1) 트리를 순회하면서 value값만 담는다.
7+
* - DFS, BFS 둘 다 가능
8+
*
9+
*/
10+
11+
class TreeNode {
12+
val: number;
13+
left: TreeNode | null;
14+
right: TreeNode | null;
15+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
16+
this.val = val === undefined ? 0 : val;
17+
this.left = left === undefined ? null : left;
18+
this.right = right === undefined ? null : right;
19+
}
20+
}
21+
22+
/*
23+
* Encodes a tree to a single string.
24+
*/
25+
function serialize(root: TreeNode | null): string {
26+
const result: string[] = [];
27+
28+
const dfs = (node: TreeNode | null) => {
29+
if (node === null) {
30+
result.push("null");
31+
return;
32+
}
33+
34+
result.push(node.val.toString());
35+
dfs(node.left);
36+
dfs(node.right);
37+
};
38+
39+
dfs(root);
40+
return result.join(",");
41+
}
42+
43+
/*
44+
* Decodes your encoded data to tree.
45+
*/
46+
function deserialize(data: string): TreeNode | null {
47+
const values = data.split(",");
48+
let i = 0;
49+
const dfs = () => {
50+
if (values[i] === "null") {
51+
i++;
52+
return null;
53+
}
54+
55+
const node = new TreeNode(Number(values[i]));
56+
i++;
57+
node.left = dfs();
58+
node.right = dfs();
59+
return node;
60+
};
61+
return dfs();
62+
}
63+
64+
/**
65+
* Your functions will be called as such:
66+
* deserialize(serialize(root));
67+
*/
68+
69+
/*
70+
* Encodes a tree to a single string.
71+
*/
72+
function serializeBFS(root: TreeNode | null): string {
73+
if (!root) return "null";
74+
75+
const queue: (TreeNode | null)[] = [root];
76+
const result: string[] = [];
77+
78+
while (queue.length > 0) {
79+
const node = queue.shift();
80+
if (node) {
81+
result.push(node.val.toString());
82+
queue.push(node.left);
83+
queue.push(node.right);
84+
} else {
85+
result.push("null");
86+
}
87+
}
88+
return result.join(",");
89+
}
90+
91+
/*
92+
* Decodes your encoded data to tree.
93+
*/
94+
function deserializeBFS(data: string): TreeNode | null {
95+
const values = data.split(",");
96+
97+
if (values[0] === "null") return null;
98+
99+
const root = new TreeNode(Number(values[0]));
100+
let i = 1;
101+
const queue: (TreeNode | null)[] = [root];
102+
103+
while (queue.length > 0 && i < values.length) {
104+
const current = queue.shift();
105+
const left = values[i++];
106+
const right = values[i++];
107+
108+
if (left !== "null") {
109+
current!.left = new TreeNode(Number(left));
110+
queue.push(current!.left);
111+
}
112+
113+
if (right !== "null") {
114+
current!.right = new TreeNode(Number(right));
115+
queue.push(current!.right);
116+
}
117+
}
118+
return root;
119+
}
120+
121+
/**
122+
* Your functions will be called as such:
123+
* deserialize(serialize(root));
124+
*/

0 commit comments

Comments
 (0)