From bed197df3f027e5595aa6591b89c65aec7af4f57 Mon Sep 17 00:00:00 2001 From: fartem Date: Wed, 7 Aug 2024 08:48:50 +0300 Subject: [PATCH] 2024-08-76 v. 6.4.1: added "109. Convert Sorted List to Binary Search Tree" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- ...nvert_sorted_list_to_binary_search_tree.rb | 55 +++++++++++++++++++ ...nvert_sorted_list_to_binary_search_tree.rb | 40 ++++++++++++++ 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 lib/medium/109_convert_sorted_list_to_binary_search_tree.rb create mode 100644 test/medium/test_109_convert_sorted_list_to_binary_search_tree.rb diff --git a/README.md b/README.md index 07141b3e..54a63f71 100644 --- a/README.md +++ b/README.md @@ -506,3 +506,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 105. Construct Binary Tree from Preorder and Inorder Traversal | [Link](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) | [Link](./lib/medium/105_construct_binary_tree_from_preorder_and_inorder_traversal.rb) | | 106. Construct Binary Tree from Inorder and Postorder Traversal | [Link](https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/) | [Link](./lib/medium/106_construct_binary_tree_from_inorder_and_postorder_traversal.rb) | | 107. Binary Tree Level Order Traversal II | [Link](https://leetcode.com/problems/binary-tree-level-order-traversal-ii/) | [Link](./lib/medium/107_binary_tree_level_order_traversal_ii.rb) | +| 109. Convert Sorted List to Binary Search Tree | [Link](https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/) | [Link](./lib/medium/109_convert_sorted_list_to_binary_search_tree.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 5253914b..766079ae 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.4.0' + s.version = '6.4.1' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/109_convert_sorted_list_to_binary_search_tree.rb b/lib/medium/109_convert_sorted_list_to_binary_search_tree.rb new file mode 100644 index 00000000..aa38d6ec --- /dev/null +++ b/lib/medium/109_convert_sorted_list_to_binary_search_tree.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require_relative '../common/binary_tree' +require_relative '../common/linked_list' + +# https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ +# @param {ListNode} head +# @return {TreeNode} +def sorted_list_to_bst(head) + return unless head + + middle = middle(head) + node = ::TreeNode.new(middle.val) + + return node if head == middle + + node.left = sorted_list_to_bst(head) + node.right = sorted_list_to_bst(middle.next) + + node +end + +# public TreeNode sortedListToBST(ListNode head) { +# if (head == null) { +# return null; +# } +# ListNode middle = middle(head); +# TreeNode node = new TreeNode(middle.val); +# if (head == middle) { +# return node; +# } +# node.left = sortedListToBST(head); +# node.right = sortedListToBST(middle.next); +# return node; +# } + +private + +# @param {ListNode} node +# @return {ListNode} +def middle(node) + fast = node + slow = node + prev = node + + while !fast.nil? && !fast.next.nil? + prev = slow + slow = slow.next + fast = fast.next.next + end + + prev.next = nil unless prev.nil? + + slow +end diff --git a/test/medium/test_109_convert_sorted_list_to_binary_search_tree.rb b/test/medium/test_109_convert_sorted_list_to_binary_search_tree.rb new file mode 100644 index 00000000..16b3cde5 --- /dev/null +++ b/test/medium/test_109_convert_sorted_list_to_binary_search_tree.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/binary_tree' +require_relative '../../lib/common/linked_list' +require_relative '../../lib/medium/109_convert_sorted_list_to_binary_search_tree' +require 'minitest/autorun' + +class ConvertSortedListToBinarySearchTreeTest < ::Minitest::Test + def test_default + assert( + ::TreeNode.are_equals( + ::TreeNode.new( + 0, + ::TreeNode.new( + -3, + ::TreeNode.new(-10), + nil + ), + ::TreeNode.new( + 9, + ::TreeNode.new(5), + nil + ) + ), + sorted_list_to_bst( + ::ListNode.from_array( + [-10, -3, 0, 5, 9] + ) + ) + ) + ) + assert( + ::TreeNode.are_equals( + nil, + sorted_list_to_bst(nil) + ) + ) + end +end