master
 1
 2def assert_equals(x, y)
 3  raise [x, y].inspect unless x == y
 4end
 5
 6class Node
 7  attr_accessor :left, :right, :value
 8
 9  def initialize(value)
10    @value = value
11  end
12end
13
14class Solution
15  def self.run(tree, level = 0)
16    return unless tree
17    return tree if bst?(tree, -100, 100)
18
19    left = run(tree.left, level + 1)
20    right = run(tree.right, level + 1)
21
22    if left && right
23      left_size = size(left)
24      right_size = size(right);
25      left_size > right_size ? tree.left : tree.right
26    else
27      tree.left || tree.right
28    end
29  end
30
31  def self.size(tree, s = 0)
32    return s if tree.nil?
33
34    size(tree.left, s) + size(tree.right, s) + 1
35  end
36
37  def self.bst?(tree, min, max)
38    return true if tree.nil?
39    return if tree.left && tree.left.value > min
40    return if tree.right && tree.right.value < max
41
42    bst?(tree.left, min, tree.value) && bst?(tree.right, tree.value, max)
43  end
44end
45
46node = Node.new(5)
47node.left = Node.new(6)
48node.right = Node.new(7)
49node.left.left = Node.new(2)
50node.right.left = Node.new(4)
51node.right.right = Node.new(9)
52
53assert_equals(Solution.run(node)&.value, node.right&.value)
54puts "YAY!"