Skip to content

Commit cde1132

Browse files
committed
Solution: Serialize and Deserialize Binary Tree
1 parent 0f67136 commit cde1132

File tree

1 file changed

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

1 file changed

+98
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/*
2+
풀이
3+
- DFS를 이용하여 풀이합니다
4+
Big O
5+
- N: 노드의 수
6+
- Serialize
7+
- Time complexity: O(N)
8+
- 모든 노드를 최대 1번 조회합니다
9+
- Space complexity: O(N)
10+
- buildString의 재귀 호출 스택의 깊이는 노드의 높이에 비례하여 증가하며, 노드의 높이는 최대 N입니다
11+
- 결과 string의 크기 또한 N에 비례하는 형태로 증가합니다
12+
- Deserialize
13+
- Time complexity: O(N)
14+
- 모든 노드를 최대 1번 조회합니다
15+
- Space complexity: O(N)
16+
- data를 split한 배열의 크기가 N에 비례하여 증가합니다
17+
- buildTree의 재귀 호출 스택의 깊이는 노드의 높이에 비례하여 증가하며, 노드의 높이는 최대 N입니다
18+
*/
19+
20+
import (
21+
"strconv"
22+
"strings"
23+
)
24+
25+
/**
26+
* Definition for a binary tree node.
27+
* type TreeNode struct {
28+
* Val int
29+
* Left *TreeNode
30+
* Right *TreeNode
31+
* }
32+
*/
33+
const (
34+
DELIMITER = "|"
35+
)
36+
37+
type Codec struct {
38+
}
39+
40+
func Constructor() Codec {
41+
codec := Codec{}
42+
return codec
43+
}
44+
45+
// Serializes a tree to a single string.
46+
func (this *Codec) serialize(root *TreeNode) string {
47+
if root == nil {
48+
return ""
49+
}
50+
var sb strings.Builder
51+
buildString(&sb, root)
52+
return sb.String()
53+
}
54+
55+
// Deserializes your encoded data to tree.
56+
func (this *Codec) deserialize(data string) *TreeNode {
57+
if data == "" {
58+
return nil
59+
}
60+
splitData := make([]string, 0, len(data)/2)
61+
splitData = strings.Split(data, DELIMITER)
62+
splitData = splitData[:len(splitData)-1]
63+
return buildTree(&splitData)
64+
}
65+
66+
// ----- Helpers -----
67+
func buildString(sb *strings.Builder, node *TreeNode) {
68+
if node == nil {
69+
sb.WriteString(DELIMITER)
70+
return
71+
}
72+
sb.WriteString(strconv.Itoa(node.Val))
73+
sb.WriteString(DELIMITER)
74+
buildString(sb, node.Left)
75+
buildString(sb, node.Right)
76+
}
77+
78+
func buildTree(splitData *[]string) *TreeNode {
79+
val := (*splitData)[0]
80+
*splitData = (*splitData)[1:]
81+
if val == "" {
82+
return nil
83+
}
84+
node := &TreeNode{}
85+
intVal, _ := strconv.Atoi(val)
86+
node.Val = intVal
87+
node.Left = buildTree(splitData)
88+
node.Right = buildTree(splitData)
89+
return node
90+
}
91+
92+
/**
93+
* Your Codec object will be instantiated and called as such:
94+
* ser := Constructor();
95+
* deser := Constructor();
96+
* data := ser.serialize(root);
97+
* ans := deser.deserialize(data);
98+
*/

0 commit comments

Comments
 (0)