Skip to content

Commit b47950a

Browse files
committed
Create index.kt
1 parent 953db7e commit b47950a

File tree

1 file changed

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

1 file changed

+73
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package masx200.leetcode_test.serialize_and_deserialize_binary_tree
2+
3+
import masx200.leetcode_test.insert_into_a_binary_search_tree.TreeNode
4+
5+
class Codec {
6+
7+
fun serialize(root: TreeNode?): String {
8+
fun serialize(node: Any?): String {
9+
return when (node) {
10+
null -> "null"
11+
is TreeNode -> {
12+
listOf(node.`val`, node.left, node.right).joinToString(",", "[", "]") { element
13+
->
14+
serialize(element)
15+
}
16+
}
17+
else -> node.toString()
18+
}
19+
}
20+
return serialize(root)
21+
}
22+
23+
fun deserialize(data: String): TreeNode? {
24+
25+
var i = 0
26+
fun dfs(): TreeNode? {
27+
val node = TreeNode()
28+
val children = mutableListOf<TreeNode?>()
29+
var sign = 1
30+
while (i < data.length) {
31+
32+
if (data[i] == ',') i++
33+
else if (data[i] == '-') {
34+
sign = -1
35+
i++
36+
} else if (data[i].isDigit()) {
37+
var next = i - 1
38+
var j = i
39+
while (j < data.length) {
40+
if (!data[j].isDigit()) {
41+
next = j
42+
break
43+
}
44+
j++
45+
}
46+
47+
node.`val` = data.substring(i, next).toInt() * sign
48+
i = next
49+
sign = 1
50+
} else if (data[i] == '[') {
51+
i++
52+
children.add(dfs())
53+
} else if (data[i] == ']') {
54+
i++
55+
children.forEachIndexed { index, tree ->
56+
if (index == 0) node.left = tree else if (index == 1) node.right = tree
57+
}
58+
59+
return node
60+
} else if (data.substring(i, i + 4) == "null") {
61+
i += 4
62+
children.add(null)
63+
}
64+
}
65+
66+
return children[0]
67+
}
68+
return when (data) {
69+
"null" -> null
70+
else -> dfs()
71+
}
72+
}
73+
}

0 commit comments

Comments
 (0)