Created
March 23, 2020 15:40
-
-
Save cshtdd/df15d5a52b450c66a33785a2b9cce9cb to your computer and use it in GitHub Desktop.
How to Serialize/Deserialize a binary tree
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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