Код
def binary_tree_compare(a_top_node, b_top_node)
convert(a_top_node) == convert(b_top_node)
end
def convert(node)
{ node.val => recurse(node) }
end
def recurse(node)
return nil if node.left.nil? && node.right.nil?
[node.left, node.right].each_with_object({}) do |n, h|
h[n.val] = recurse(n) unless n.nil?
end
end
Пример
Давайте сначала создадим два двоичных дерева. Они будут выглядеть следующим образом.
Эти деревья имеют одинаковую структуру.
Это ваш класс TreeNode
.
class TreeNode
attr_accessor :val, :left, :right
def initialize val, left = nil, right = nil
@val = val
@left = left
@right = right
end
end
Кроме того, я создам класс Tree
.
class Tree
attr_reader :top_node, :name_to_node
def initialize(top_node_name)
@top_node = TreeNode.new(top_node_name)
@name_to_node = { top_node_name=>@top_node }
end
def add_node(name, parent, side)
node = TreeNode.new(name)
name_to_node[name] = node
if side == :left
name_to_node[parent].left = node
else
name_to_node[parent].right = node
end
end
end
Теперь мы можем построить два двоичных дерева, показанных на рисунке.
a = Tree.new(1)
a.add_node(2, 1, :left)
a.add_node(3, 1, :right)
a.add_node(4, 2, :left)
a.add_node(5, 3, :right)
a.top_node
#=> #<TreeNode:0x000059e97fa499e0 @val=1,
# @left=#<TreeNode:0x000059e97fa508d0 @val=2,
# @left=#<TreeNode:0x000059e97fa719b8 @val=4, @left=nil, @right=nil>,
# @right=nil>,
# @right=#<TreeNode:0x000059e97fa66900 @val=3,
# @left=nil,
# @right=#<TreeNode:0x000059e97fa7cb60 @val=5, @left=nil, @right=nil>>>
b = Tree.new(1)
b.add_node(2, 1, :right)
b.add_node(3, 1, :left)
b.add_node(4, 2, :right)
b.add_node(5, 3, :left)
b.top_node
#=> #<TreeNode:0x000059e97fa99b48 @val=1,
# @left=#<TreeNode:0x000059e97fab5758 @val=3,
# @left=#<TreeNode:0x000059e97faf4cf0 @val=5, @left=nil, @right=nil>,
# @right=nil>,
# @right=#<TreeNode:0x000059e97faaf9e8 @val=2,
# @left=nil,
# @right=#<TreeNode:0x000059e97fac0040 @val=4, @left=nil, @right=nil>>>
Теперь определите, равны ли эти два двоичных дерева по структуре.
binary_tree_compare(a.top_node, b.top_node)
#=> true
Объяснение
convert
возвращает следующие хэши.
convert(a.top_node)
#=> {1=>{2=>{4=>nil}, 3=>{5=>nil}}}
convert(b.top_node)
#=> {1=>{3=>{5=>nil}, 2=>{4=>nil}}}
Эти хэши, которые являются 1-1 отображениями двоичных деревьев, явно равны, даже если их ключи не в том же порядке.