Serialize and Deserialize BST
Problem Description
Serialization is converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.
Design an algorithm to serialize and deserialize a binary search tree. There is no restriction on how your serialization/deserialization algorithm should work. You need to ensure that a binary search tree can be serialized to a string, and this string can be deserialized to the original tree structure.
The encoded string should be as compact as possible.
Example 1:
Input: root = [2,1,3] Output: [2,1,3]
Example 2:
Input: root = [] Output: []
Constraints:
- The number of nodes in the tree is in the range
[0, 104]. 0 <= Node.val <= 104- The input tree is guaranteed to be a binary search tree.
Solution (Go)
type Codec struct {
cur *list.Element
}
func Constructor() Codec {
return Codec{}
}
// Serializes a tree to a single string.
func (this *Codec) serialize(root *TreeNode) string {
if root == nil {
return ""
}
return fmt.Sprintf("%d,%s%s", root.Val, this.serialize(root.Left), this.serialize(root.Right))
}
// Deserializes your encoded data to tree.
func (this *Codec) deserialize(data string) *TreeNode {
arr := strings.Split(data, ",")
l := list.New()
for _, v := range arr {
if v != "" {
l.PushBack(v)
}
}
this.cur = l.Front()
return this.deserializeList(0, math.MaxUint16)
}
// Deserializes your list to tree.
func (this *Codec) deserializeList(lower, upper int) *TreeNode {
if this.cur == nil {
return nil
}
valInt, _ := strconv.Atoi(this.cur.Value.(string))
if valInt < lower || valInt > upper {
return nil
}
node := &TreeNode{valInt, nil, nil}
this.cur = this.cur.Next()
node.Left = this.deserializeList(lower, valInt)
node.Right = this.deserializeList(valInt, upper)
return node
}