master
 1# Given a tree, determine if it is a valid binary search tree.
 2
 3def assert_equal(x, y)
 4  raise "Expected: #{x}, Got: #{y}" unless x == y
 5end
 6
 7class Node
 8  attr_accessor :right, :left
 9  attr_reader :value
10
11  def initialize(value)
12    @value = value
13  end
14end
15
16class Solution
17  def self.in_range?(node, low, high)
18    return true if node.nil?
19    return false if node.value < low
20    return false if node.value > high
21
22    return in_range?(node.left, low, node.value) &&
23      in_range?(node.right, node.value, high)
24  end
25
26  def self.is_valid?(tree)
27    in_range?(tree, -100, 100)
28  end
29end
30
31=begin
32    5
33   / \
34  4   7
35=end
36tree = Node.new(5)
37tree.left = Node.new(4)
38tree.right = Node.new(7)
39
40assert_equal true, Solution.is_valid?(tree)
41
42=begin
43    5
44   / \
45  4   7
46     /
47    2
48=end
49tree = Node.new(5)
50tree.left = Node.new(4)
51tree.right = Node.new(7)
52tree.right.left = Node.new(2)
53
54assert_equal false, Solution.is_valid?(tree)