summaryrefslogtreecommitdiff
path: root/2020/09/29/main.rb
blob: 633e354108bb9634afeddeaa64f0c6eb93f086b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

def assert_equals(x, y)
  raise [x, y].inspect unless x == y
end

class Node
  attr_accessor :left, :right, :value

  def initialize(value)
    @value = value
  end
end

class Solution
  def self.run(tree, level = 0)
    return unless tree
    return tree if bst?(tree, -100, 100)

    left = run(tree.left, level + 1)
    right = run(tree.right, level + 1)

    if left && right
      left_size = size(left)
      right_size = size(right);
      left_size > right_size ? tree.left : tree.right
    else
      tree.left || tree.right
    end
  end

  def self.size(tree, s = 0)
    return s if tree.nil?

    size(tree.left, s) + size(tree.right, s) + 1
  end

  def self.bst?(tree, min, max)
    return true if tree.nil?
    return if tree.left && tree.left.value > min
    return if tree.right && tree.right.value < max

    bst?(tree.left, min, tree.value) && bst?(tree.right, tree.value, max)
  end
end

node = Node.new(5)
node.left = Node.new(6)
node.right = Node.new(7)
node.left.left = Node.new(2)
node.right.left = Node.new(4)
node.right.right = Node.new(9)

assert_equals(Solution.run(node)&.value, node.right&.value)
puts "YAY!"