diff --git a/README.md b/README.md index d990fb83..9d68fada 100644 --- a/README.md +++ b/README.md @@ -499,3 +499,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 92. Reverse Linked List II | [Link](https://leetcode.com/problems/reverse-linked-list-ii/) | [Link](./lib/medium/92_reverse_linked_list_ii.rb) | | 95. Unique Binary Search Trees II | [Link](https://leetcode.com/problems/unique-binary-search-trees-ii/) | [Link](./lib/medium/95_unique_binary_search_trees_ii.rb) | | 96. Unique Binary Search Trees | [Link](https://leetcode.com/problems/unique-binary-search-trees/) | [Link](./lib/medium/96_unique_binary_search_trees.rb) | +| 98. Validate Binary Search Tree | [Link](https://leetcode.com/problems/validate-binary-search-tree/) | [Link](./lib/medium/98_validate_binary_search_tree.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index e05d6fff..c67f7690 100644 --- a/leetcode-ruby.gemspec +++ b/leetcode-ruby.gemspec @@ -5,7 +5,7 @@ require 'English' ::Gem::Specification.new do |s| s.required_ruby_version = '>= 3.0' s.name = 'leetcode-ruby' - s.version = '6.3.3' + s.version = '6.3.4' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/98_validate_binary_search_tree.rb b/lib/medium/98_validate_binary_search_tree.rb new file mode 100644 index 00000000..52a759a7 --- /dev/null +++ b/lib/medium/98_validate_binary_search_tree.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/validate-binary-search-tree/ +# @param {TreeNode} root +# @return {Boolean} +def is_valid_bst(root) + is_bst(root, nil, nil) +end + +private + +# @param {TreeNode} root +# @param {TreeNode} left +# @param {TreeNode} right +# @return {Boolean} +def is_bst(node, left, right) + return true unless node + + return false if !left.nil? && node.val <= left.val + + return false if !right.nil? && node.val >= right.val + + is_bst(node.left, left, node) && is_bst(node.right, node, right) +end diff --git a/test/medium/test_98_validate_binary_search_tree.rb b/test/medium/test_98_validate_binary_search_tree.rb new file mode 100644 index 00000000..09918881 --- /dev/null +++ b/test/medium/test_98_validate_binary_search_tree.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/binary_tree' +require_relative '../../lib/medium/98_validate_binary_search_tree' +require 'minitest/autorun' + +class ValidateBinarySearchTreeTest < ::Minitest::Test + def test_default + assert( + is_valid_bst( + ::TreeNode.new( + 2, + ::TreeNode.new(1), + ::TreeNode.new(3) + ) + ) + ) + assert( + !is_valid_bst( + ::TreeNode.new( + 5, + ::TreeNode.new(1), + ::TreeNode.new( + 4, + ::TreeNode.new(3), + ::TreeNode.new(6) + ) + ) + ) + ) + end +end