master
  1#!/usr/bin/env ruby
  2
  3def assert_equal(x, y)
  4  raise "expected: #{x.inspect}, actual: #{y.inspect}" unless x == y
  5end
  6
  7class Node
  8  attr_reader :value, :left, :right
  9
 10  def initialize(value, left = nil, right = nil)
 11    @value = value
 12    @left = left
 13    @right = right
 14  end
 15
 16  def inspect
 17    "(#{value}, #{left.inspect}, #{right.inspect})"
 18  end
 19end
 20
 21
 22def find_subtree(s, t)
 23  puts [s&.value, t&.value].inspect if ENV['DEBUG']
 24
 25  return t.nil? if s.nil?
 26  return s.nil? if t.nil?
 27
 28  if s.value == t.value
 29    return find_subtree(s.right, t.right) if s.left.nil?
 30    return find_subtree(s&.left, t&.left) if s.right.nil?
 31    return find_subtree(s&.left, t&.left) && find_subtree(s.right, t.right)
 32  end
 33
 34  return find_subtree(s, t&.left) || find_subtree(s, t&.right)
 35end
 36
 37
 38t = Node.new(
 39  1,
 40  Node.new(
 41    5,
 42    Node.new(4),
 43    Node.new(-1)
 44  ),
 45  Node.new(
 46    4,
 47    Node.new(3),
 48    Node.new(2)
 49  )
 50)
 51s = Node.new(
 52  4,
 53  Node.new(3),
 54  Node.new(2)
 55)
 56
 57assert_equal(true, find_subtree(s, t))
 58
 59t = Node.new(
 60  1,
 61  Node.new(
 62    5,
 63    Node.new(4),
 64    Node.new(-1)
 65  ),
 66  Node.new(
 67    4,
 68    Node.new(3),
 69    Node.new(2)
 70  )
 71)
 72s = Node.new(
 73  5,
 74  Node.new(4),
 75  Node.new(-1)
 76)
 77assert_equal(true, find_subtree(s, t))
 78
 79t = Node.new(
 80  1,
 81  Node.new(
 82    5,
 83    Node.new(4),
 84    Node.new(-1)
 85  ),
 86  Node.new(
 87    4,
 88    Node.new(3),
 89    Node.new(2)
 90  )
 91)
 92s = Node.new(3)
 93assert_equal(true, find_subtree(s, t))
 94
 95t = Node.new(
 96  1,
 97  Node.new(
 98    5,
 99    Node.new(4),
100    Node.new(-1)
101  ),
102  Node.new(
103    4,
104    Node.new(3),
105    Node.new(2)
106  )
107)
108s = Node.new(2)
109assert_equal(true, find_subtree(s, t))
110
111t = Node.new(
112  1,
113  Node.new(
114    5,
115    Node.new(4),
116    Node.new(-1)
117  ),
118  Node.new(
119    4,
120    Node.new(3),
121    Node.new(2)
122  )
123)
124s = Node.new(
125  1,
126  Node.new(
127    5,
128    Node.new(4),
129    Node.new(-1)
130  ),
131  Node.new(
132    4,
133    Node.new(3),
134    Node.new(2)
135  )
136)
137assert_equal(true, find_subtree(s, t))
138
139t = Node.new(
140  1,
141  Node.new(
142    5,
143    Node.new(4),
144    Node.new(-1)
145  ),
146  Node.new(
147    4,
148    Node.new(3),
149    Node.new(2)
150  )
151)
152s = Node.new(
153  1,
154  Node.new(
155    5,
156    nil,
157    Node.new(-1)
158  ),
159)
160assert_equal(true, find_subtree(s, t))
161
162
163t = Node.new(
164  1,
165  Node.new(
166    5,
167    Node.new(4),
168  ),
169  Node.new(
170    4,
171    Node.new(3),
172    Node.new(2)
173  )
174)
175s = Node.new(
176  1,
177  Node.new(
178    5,
179    Node.new(4),
180    Node.new(-1)
181  ),
182  Node.new(
183    4,
184    Node.new(3),
185    Node.new(2)
186  )
187)
188
189assert_equal(false, find_subtree(s, t))
190
191assert_equal(false, find_subtree(nil, t))