Skip to content

Instantly share code, notes, and snippets.

@cshtdd
Created March 23, 2020 15:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cshtdd/df15d5a52b450c66a33785a2b9cce9cb to your computer and use it in GitHub Desktop.
Save cshtdd/df15d5a52b450c66a33785a2b9cce9cb to your computer and use it in GitHub Desktop.
How to Serialize/Deserialize a binary tree
# Binary tree
# 1. value (int)
# 2. left node (Tree or nil)
# 3. right node (Tree or nil)
class Tree
attr_accessor :value
attr_accessor :left_node
attr_accessor :right_node
def initialize(value, left_node, right_node)
self.value = value
self.left_node = left_node
self.right_node = right_node
end
end
def serialize(tree)
return 'null' if tree.nil?
[
"#{tree.value}",
serialize(tree.left_node),
serialize(tree.right_node)
].join(',')
end
def deserialize(s)
pieces = s.split(',')
deserialize_internal(pieces)
end
def deserialize_internal(pieces)
return nil if pieces.empty?
if pieces[0] == 'null'
pieces.delete_at(0)
return nil
end
n = Tree.new(pieces[0].to_i, nil, nil)
pieces.delete_at(0)
n.left_node = deserialize_internal(pieces)
n.right_node = deserialize_internal(pieces)
n
end
# Example 1:
#
# 11
# 2 3
# null 4 null null
#
# Preorder
# 11,2,null,4,null,null,3,null,null
# Example 2:
#
# 11
# 2 3
# null 4 null null
# 5 null
# null null
#
# Preorder
# 11,2,null,4,5,null,null,null,3,null,null
n4 = Tree.new(4, nil, nil)
n2 = Tree.new(2, nil, n4)
n3 = Tree.new(3, nil, nil)
t = Tree.new(11, n2, n3)
s = serialize(t)
puts s
dt = deserialize(s)
s2 = serialize(dt)
puts s2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment