From 31eafccd3193a34ea78defdf55b09de2e0e1af50 Mon Sep 17 00:00:00 2001 From: fartem Date: Tue, 30 Jul 2024 20:51:04 +0300 Subject: [PATCH] 2024-08-30 v. 6.3.5: added "99. Recover Binary Search Tree" --- README.md | 5 +- leetcode-ruby.gemspec | 2 +- lib/medium/99_recover_binary_search_tree.rb | 45 ++++++++++++++ .../test_99_recover_binary_search_tree.rb | 62 +++++++++++++++++++ 4 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 lib/medium/99_recover_binary_search_tree.rb create mode 100644 test/medium/test_99_recover_binary_search_tree.rb diff --git a/README.md b/README.md index 9d68fada..ab02acfa 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). ### Easy | Name | Link to LeetCode | Link to solution | -|--------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| +| ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | 1. Two Sum | [Link](https://leetcode.com/problems/two-sum/) | [Link](./lib/easy/1_two_sum.rb) | | 9. Palindrome Number | [Link](https://leetcode.com/problems/palindrome-number/) | [Link](./lib/easy/9_palindrome_number.rb) | | 13. Roman to Integer | [Link](https://leetcode.com/problems/roman-to-integer/) | [Link](./lib/easy/13_roman_to_integer.rb) | @@ -458,7 +458,7 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). ### Medium | Name | Link to LeetCode | Link to solution | -|-------------------------------------------------------------|------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------| +| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | | 2. Add Two Numbers | [Link](https://leetcode.com/problems/add-two-numbers/) | [Link](./lib/medium/2_add_two_numbers.rb) | | 3. Longest Substring Without Repeating Characters | [Link](https://leetcode.com/problems/longest-substring-without-repeating-characters/) | [Link](./lib/medium/3_longest_substring_without_repeating_characters.rb) | | 5. Longest Palindromic Substring | [Link](https://leetcode.com/problems/longest-palindromic-substring/) | [Link](./lib/medium/5_longest_palindromic_substring.rb) | @@ -500,3 +500,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 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) | +| 99. Recover Binary Search Tree | [Link](https://leetcode.com/problems/recover-binary-search-tree/) | [Link](./lib/medium/99_recover_binary_search_tree.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index c67f7690..adecaff7 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.4' + s.version = '6.3.5' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/99_recover_binary_search_tree.rb b/lib/medium/99_recover_binary_search_tree.rb new file mode 100644 index 00000000..d7d9c382 --- /dev/null +++ b/lib/medium/99_recover_binary_search_tree.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/recover-binary-search-tree/ +# @param {TreeNode} root +# @return {Void} Do not return anything, modify root in-place instead. +def recover_tree(root) + nodes = [] + traverse99(root, nodes) + first = nil + (0...(nodes.length - 1)).each do |i| + curr = nodes[i] + nxt = nodes[i + 1] + + puts(curr.val) + puts(nxt.val) + + first = nxt if nxt.val < curr.val + end + + second = nodes.first + (1...nodes.length).each do |i| + prev = nodes[i - 1] + curr = nodes[i] + + next unless prev.val < first.val && first.val < curr.val + + second = curr + + break + end + + temp = first.val + first.val = second.val + second.val = temp +end + +private + +def traverse99(root, nodes) + return unless root + + traverse99(root.left, nodes) + nodes << root + traverse99(root.right, nodes) +end diff --git a/test/medium/test_99_recover_binary_search_tree.rb b/test/medium/test_99_recover_binary_search_tree.rb new file mode 100644 index 00000000..56b059b5 --- /dev/null +++ b/test/medium/test_99_recover_binary_search_tree.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/binary_tree' +require_relative '../../lib/medium/99_recover_binary_search_tree' +require 'minitest/autorun' + +class RecoverBinarySearchTreeTest < ::Minitest::Test + def test_default + input = ::TreeNode.new( + 1, + ::TreeNode.new( + 3, + nil, + ::TreeNode.new(2) + ), + nil + ) + recover_tree(input) + + assert( + ::TreeNode.are_equals( + ::TreeNode.new( + 3, + ::TreeNode.new( + 1, + nil, + ::TreeNode.new(2) + ), + nil + ), + input + ) + ) + + input = ::TreeNode.new( + 3, + ::TreeNode.new(1), + ::TreeNode.new( + 4, + ::TreeNode.new(2), + nil + ) + ) + recover_tree(input) + + assert( + ::TreeNode.are_equals( + ::TreeNode.new( + 2, + ::TreeNode.new(1), + ::TreeNode.new( + 4, + ::TreeNode.new(3), + nil + ) + ), + input + ) + ) + end +end