From ebb795a342f39c765ec78e5af3b2cfbb0d039384 Mon Sep 17 00:00:00 2001 From: fartem Date: Fri, 2 Aug 2024 09:42:02 +0300 Subject: [PATCH] 2024-08-02 v. 6.3.9: added "105. Construct Binary Tree from Preorder and Inorder Traversal" --- README.md | 93 ++++++++++--------- leetcode-ruby.gemspec | 2 +- ...ree_from_preorder_and_inorder_traversal.rb | 38 ++++++++ ...ree_from_preorder_and_inorder_traversal.rb | 34 +++++++ 4 files changed, 120 insertions(+), 47 deletions(-) create mode 100644 lib/medium/105_construct_binary_tree_from_preorder_and_inorder_traversal.rb create mode 100644 test/medium/test_105_construct_binary_tree_from_preorder_and_inorder_traversal.rb diff --git a/README.md b/README.md index 69203805..dbb5f934 100644 --- a/README.md +++ b/README.md @@ -457,49 +457,50 @@ 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) | -| 7. Reverse Integer | [Link](https://leetcode.com/problems/reverse-integer/) | [Link](./lib/medium/7_reverse_integer.rb) | -| 8. String to Integer (atoi) | [Link](https://leetcode.com/problems/string-to-integer-atoi/) | [Link](./lib/medium/8_string_to_integer_atoi.rb) | -| 11. Container With Most Water | [Link](https://leetcode.com/problems/container-with-most-water/) | [Link](./lib/medium/11_container_with_most_water.rb) | -| 12. Integer to Roman | [Link](https://leetcode.com/problems/integer-to-roman/) | [Link](./lib/medium/12_integer_to_roman.rb) | -| 15. 3Sum | [Link](https://leetcode.com/problems/3sum/) | [Link](./lib/medium/15_3sum.rb) | -| 16. 3Sum Closest | [Link](https://leetcode.com/problems/3sum-closest/) | [Link](./lib/medium/16_3sum_closest.rb) | -| 17. Letter Combinations of a Phone Number | [Link](https://leetcode.com/problems/letter-combinations-of-a-phone-number/) | [Link](./lib/medium/17_letter_combinations_of_a_phone_number.rb) | -| 19. Remove Nth Node From End of List | [Link](https://leetcode.com/problems/remove-nth-node-from-end-of-list/) | [Link](./lib/medium/19_remove_nth_node_from_end_of_list.rb) | -| 22. Generate Parentheses | [Link](https://leetcode.com/problems/generate-parentheses/) | [Link](./lib/medium/22_generate_parentheses.rb) | -| 24. Swap Nodes in Pairs | [Link](https://leetcode.com/problems/swap-nodes-in-pairs/) | [Link](./lib/medium/24_swap_nodes_in_pairs.rb) | -| 29. Divide Two Integers | [Link](https://leetcode.com/problems/divide-two-integers/) | [Link](./lib/medium/29_divide_two_integers.rb) | -| 33. Search in Rotated Sorted Array | [Link](https://leetcode.com/problems/search-in-rotated-sorted-array/) | [Link](./lib/medium/33_search_in_rotated_sorted_array.rb) | -| 34. Find First and Last Position of Element in Sorted Array | [Link](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/) | [Link](./lib/medium/34_find_first_and_last_position_of_element_in_sorted_array.rb) | -| 36. Valid Sudoku | [Link](https://leetcode.com/problems/valid-sudoku/) | [Link](./lib/medium/36_valid_sudoku.rb) | -| 38. Count and Say | [Link](https://leetcode.com/problems/count-and-say/) | [Link](./lib/medium/38_count_and_say.rb) | -| 39. Combination Sum | [Link](https://leetcode.com/problems/combination-sum/) | [Link](./lib/medium/39_combination_sum.rb) | -| 43. Multiply Strings | [Link](https://leetcode.com/problems/multiply-strings/) | [Link](./lib/medium/43_multiply_strings.rb) | -| 46. Permutations | [Link](https://leetcode.com/problems/permutations/) | [Link](./lib/medium/46_permutations.rb) | -| 48. Rotate Image | [Link](https://leetcode.com/problems/rotate-image/) | [Link](./lib/medium/48_rotate_image.rb) | -| 49. Group Anagrams | [Link](https://leetcode.com/problems/group-anagrams/) | [Link](./lib/medium/49_group_anagrams.rb) | -| 53. Maximum Subarray | [Link](https://leetcode.com/problems/maximum-subarray/) | [Link](./lib/medium/53_maximum_subarray.rb) | -| 54. Spiral Matrix | [Link](https://leetcode.com/problems/spiral-matrix/) | [Link](./lib/medium/54_spiral_matrix.rb) | -| 55. Jump Game | [Link](https://leetcode.com/problems/jump-game/) | [Link](./lib/medium/55_jump_game.rb) | -| 56. Merge Intervals | [Link](https://leetcode.com/problems/merge-intervals/) | [Link](./lib/medium/56_merge_intervals.rb) | -| 57. Insert Interval | [Link](https://leetcode.com/problems/insert-interval/) | [Link](./lib/medium/57_insert_interval.rb) | -| 59. Spiral Matrix II | [Link](https://leetcode.com/problems/spiral-matrix-ii/) | [Link](./lib/medium/59_spiral_matrix_ii.rb) | -| 61. Rotate List | [Link](https://leetcode.com/problems/rotate-list/) | [Link](./lib/medium/61_rotate_list.rb) | -| 62. Unique Paths | [Link](https://leetcode.com/problems/unique-paths/) | [Link](./lib/medium/62_unique_paths.rb) | -| 71. Simplify Path | [Link](https://leetcode.com/problems/simplify-path/) | [Link](./lib/medium/71_simplify_path.rb) | -| 74. Search a 2D Matrix | [Link](https://leetcode.com/problems/search-a-2d-matrix/) | [Link](./lib/medium/74_search_a_2d_matrix.rb) | -| 75. Sort Colors | [Link](https://leetcode.com/problems/sort-colors/) | [Link](./lib/medium/75_sort_colors.rb) | -| 78. Subsets | [Link](https://leetcode.com/problems/subsets/) | [Link](./lib/medium/78_subsets.rb) | -| 82. Remove Duplicates from Sorted List II | [Link](https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/) | [Link](./lib/medium/82_remove_duplicates_from_sorted_list_ii.rb) | -| 86. Partition List | [Link](https://leetcode.com/problems/partition-list/) | [Link](./lib/medium/86_partition_list.rb) | -| 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) | -| 99. Recover Binary Search Tree | [Link](https://leetcode.com/problems/recover-binary-search-tree/) | [Link](./lib/medium/99_recover_binary_search_tree.rb) | -| 102. Binary Tree Level Order Traversal | [Link](https://leetcode.com/problems/binary-tree-level-order-traversal/) | [Link](./lib/medium/102_binary_tree_level_order_traversal.rb) | -| 103. Binary Tree Zigzag Level Order Traversal | [Link](https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/) | [Link](./lib/medium/103_binary_tree_zigzag_level_order_traversal.rb) | +| 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) | +| 7. Reverse Integer | [Link](https://leetcode.com/problems/reverse-integer/) | [Link](./lib/medium/7_reverse_integer.rb) | +| 8. String to Integer (atoi) | [Link](https://leetcode.com/problems/string-to-integer-atoi/) | [Link](./lib/medium/8_string_to_integer_atoi.rb) | +| 11. Container With Most Water | [Link](https://leetcode.com/problems/container-with-most-water/) | [Link](./lib/medium/11_container_with_most_water.rb) | +| 12. Integer to Roman | [Link](https://leetcode.com/problems/integer-to-roman/) | [Link](./lib/medium/12_integer_to_roman.rb) | +| 15. 3Sum | [Link](https://leetcode.com/problems/3sum/) | [Link](./lib/medium/15_3sum.rb) | +| 16. 3Sum Closest | [Link](https://leetcode.com/problems/3sum-closest/) | [Link](./lib/medium/16_3sum_closest.rb) | +| 17. Letter Combinations of a Phone Number | [Link](https://leetcode.com/problems/letter-combinations-of-a-phone-number/) | [Link](./lib/medium/17_letter_combinations_of_a_phone_number.rb) | +| 19. Remove Nth Node From End of List | [Link](https://leetcode.com/problems/remove-nth-node-from-end-of-list/) | [Link](./lib/medium/19_remove_nth_node_from_end_of_list.rb) | +| 22. Generate Parentheses | [Link](https://leetcode.com/problems/generate-parentheses/) | [Link](./lib/medium/22_generate_parentheses.rb) | +| 24. Swap Nodes in Pairs | [Link](https://leetcode.com/problems/swap-nodes-in-pairs/) | [Link](./lib/medium/24_swap_nodes_in_pairs.rb) | +| 29. Divide Two Integers | [Link](https://leetcode.com/problems/divide-two-integers/) | [Link](./lib/medium/29_divide_two_integers.rb) | +| 33. Search in Rotated Sorted Array | [Link](https://leetcode.com/problems/search-in-rotated-sorted-array/) | [Link](./lib/medium/33_search_in_rotated_sorted_array.rb) | +| 34. Find First and Last Position of Element in Sorted Array | [Link](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/) | [Link](./lib/medium/34_find_first_and_last_position_of_element_in_sorted_array.rb) | +| 36. Valid Sudoku | [Link](https://leetcode.com/problems/valid-sudoku/) | [Link](./lib/medium/36_valid_sudoku.rb) | +| 38. Count and Say | [Link](https://leetcode.com/problems/count-and-say/) | [Link](./lib/medium/38_count_and_say.rb) | +| 39. Combination Sum | [Link](https://leetcode.com/problems/combination-sum/) | [Link](./lib/medium/39_combination_sum.rb) | +| 43. Multiply Strings | [Link](https://leetcode.com/problems/multiply-strings/) | [Link](./lib/medium/43_multiply_strings.rb) | +| 46. Permutations | [Link](https://leetcode.com/problems/permutations/) | [Link](./lib/medium/46_permutations.rb) | +| 48. Rotate Image | [Link](https://leetcode.com/problems/rotate-image/) | [Link](./lib/medium/48_rotate_image.rb) | +| 49. Group Anagrams | [Link](https://leetcode.com/problems/group-anagrams/) | [Link](./lib/medium/49_group_anagrams.rb) | +| 53. Maximum Subarray | [Link](https://leetcode.com/problems/maximum-subarray/) | [Link](./lib/medium/53_maximum_subarray.rb) | +| 54. Spiral Matrix | [Link](https://leetcode.com/problems/spiral-matrix/) | [Link](./lib/medium/54_spiral_matrix.rb) | +| 55. Jump Game | [Link](https://leetcode.com/problems/jump-game/) | [Link](./lib/medium/55_jump_game.rb) | +| 56. Merge Intervals | [Link](https://leetcode.com/problems/merge-intervals/) | [Link](./lib/medium/56_merge_intervals.rb) | +| 57. Insert Interval | [Link](https://leetcode.com/problems/insert-interval/) | [Link](./lib/medium/57_insert_interval.rb) | +| 59. Spiral Matrix II | [Link](https://leetcode.com/problems/spiral-matrix-ii/) | [Link](./lib/medium/59_spiral_matrix_ii.rb) | +| 61. Rotate List | [Link](https://leetcode.com/problems/rotate-list/) | [Link](./lib/medium/61_rotate_list.rb) | +| 62. Unique Paths | [Link](https://leetcode.com/problems/unique-paths/) | [Link](./lib/medium/62_unique_paths.rb) | +| 71. Simplify Path | [Link](https://leetcode.com/problems/simplify-path/) | [Link](./lib/medium/71_simplify_path.rb) | +| 74. Search a 2D Matrix | [Link](https://leetcode.com/problems/search-a-2d-matrix/) | [Link](./lib/medium/74_search_a_2d_matrix.rb) | +| 75. Sort Colors | [Link](https://leetcode.com/problems/sort-colors/) | [Link](./lib/medium/75_sort_colors.rb) | +| 78. Subsets | [Link](https://leetcode.com/problems/subsets/) | [Link](./lib/medium/78_subsets.rb) | +| 82. Remove Duplicates from Sorted List II | [Link](https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/) | [Link](./lib/medium/82_remove_duplicates_from_sorted_list_ii.rb) | +| 86. Partition List | [Link](https://leetcode.com/problems/partition-list/) | [Link](./lib/medium/86_partition_list.rb) | +| 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) | +| 99. Recover Binary Search Tree | [Link](https://leetcode.com/problems/recover-binary-search-tree/) | [Link](./lib/medium/99_recover_binary_search_tree.rb) | +| 102. Binary Tree Level Order Traversal | [Link](https://leetcode.com/problems/binary-tree-level-order-traversal/) | [Link](./lib/medium/102_binary_tree_level_order_traversal.rb) | +| 103. Binary Tree Zigzag Level Order Traversal | [Link](https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/) | [Link](./lib/medium/103_binary_tree_zigzag_level_order_traversal.rb) | +| 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) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 113a3521..2aea231e 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.7' + s.version = '6.3.8' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/105_construct_binary_tree_from_preorder_and_inorder_traversal.rb b/lib/medium/105_construct_binary_tree_from_preorder_and_inorder_traversal.rb new file mode 100644 index 00000000..e54d8edc --- /dev/null +++ b/lib/medium/105_construct_binary_tree_from_preorder_and_inorder_traversal.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require_relative '../common/binary_tree' + +$pre_index = 0 + +# https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ +# @param {Integer[]} preorder +# @param {Integer[]} inorder +# @return {TreeNode} +def build_tree(preorder, inorder) + $pre_index = 0 + in_index = {} + (0...inorder.size).each do |i| + in_index[inorder[i]] = i + end + + array_to_tree(preorder, 0, preorder.size - 1, in_index) +end + +private + +# @param {Integer[]} pre +# @param {Integer} l +# @param {Integer} r +# @param {Hash} in_index +def array_to_tree(pre, l, r, in_index) + return if l > r + + val = pre[$pre_index] + $pre_index += 1 + + root = ::TreeNode.new(val) + root.left = array_to_tree(pre, l, in_index[val] - 1, in_index) + root.right = array_to_tree(pre, in_index[val] + 1, r, in_index) + + root +end diff --git a/test/medium/test_105_construct_binary_tree_from_preorder_and_inorder_traversal.rb b/test/medium/test_105_construct_binary_tree_from_preorder_and_inorder_traversal.rb new file mode 100644 index 00000000..b5028861 --- /dev/null +++ b/test/medium/test_105_construct_binary_tree_from_preorder_and_inorder_traversal.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/binary_tree' +require_relative '../../lib/medium/105_construct_binary_tree_from_preorder_and_inorder_traversal' +require 'minitest/autorun' + +class ConstructBinaryTreeFromPreorderAndInorderTraversalTest < ::Minitest::Test + def test_default + assert( + ::TreeNode.are_equals( + ::TreeNode.new( + 3, + ::TreeNode.new(9), + ::TreeNode.new( + 20, + ::TreeNode.new(15), + ::TreeNode.new(7) + ) + ), + build_tree( + [3, 9, 20, 15, 7], + [9, 3, 15, 20, 7] + ) + ) + ) + assert( + ::TreeNode.are_equals( + ::TreeNode.new(-1), + build_tree([-1], [-1]) + ) + ) + end +end