Skip to content

Commit cfa8bad

Browse files
committed
문제 추가
1 parent 1bc95ef commit cfa8bad

File tree

1 file changed

+69
-0
lines changed
  • serialize-and-deserialize-binary-tree

1 file changed

+69
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
import java.util.StringJoiner
6+
7+
/**
8+
* 문제의 핵심은 트리를 탐색하는 순서 기준으로 직렬화된 문자열을 반대로 풀어내는 것
9+
* 직렬화를 DFS로 해결하면 역직렬화시 선입선출 방식으로 해결하여야 하고,
10+
* 직렬화를 BFS로 해결하면 역직렬화시 힙의 인덱스 규칙을 이용하여 해결할 수 있을 듯
11+
*/
12+
class `serialize-and-deserialize-binary-tree` {
13+
14+
private val empty = "X"
15+
private val delimiter = "|"
16+
17+
/**
18+
* DFS로 탐색하면서 노드의 값을 누적한다.
19+
* TC: O(n), SC: O(n)
20+
*/
21+
fun serialize(root: TreeNode?): String {
22+
if (root == null) return ""
23+
24+
val joiner = StringJoiner("|")
25+
nodeToString(root, joiner)
26+
return joiner.toString()
27+
}
28+
29+
private fun nodeToString(node: TreeNode?, joiner: StringJoiner) {
30+
if (node == null) {
31+
joiner.add(empty)
32+
} else {
33+
joiner.add(node.`val`.toString())
34+
nodeToString(node.left, joiner)
35+
nodeToString(node.right, joiner)
36+
}
37+
}
38+
39+
/**
40+
* 깊이 탐색으로 누적된 문자열을 선입선출로 꺼내어 노드를 생성한다.
41+
* TC: O(n), SC: O(n)
42+
*/
43+
fun deserialize(data: String): TreeNode? {
44+
if (data.isEmpty()) return null
45+
return stringToNode(ArrayDeque(data.split(delimiter)))
46+
}
47+
48+
private fun stringToNode(queue: ArrayDeque<String>): TreeNode? {
49+
val value = queue.removeFirst()
50+
return if (value == empty) {
51+
null
52+
} else {
53+
val node = TreeNode(value.toInt())
54+
node.left = stringToNode(queue)
55+
node.right = stringToNode(queue)
56+
node
57+
}
58+
}
59+
60+
@Test
61+
fun `트리 노드를 직렬화한다`() {
62+
serialize(TreeNode.of(1,2,3,null,null,4,5)) shouldBe "1|2|X|X|3|4|X|X|5|X|X"
63+
}
64+
65+
@Test
66+
fun `문자열을 트리 노드로 역직렬화한다`() {
67+
deserialize("1|2|X|X|3|4|X|X|5|X|X") shouldBe TreeNode.of(1,2,3,null,null,4,5)
68+
}
69+
}

0 commit comments

Comments
 (0)