diff --git a/README.md b/README.md index 970602b1..d0dda127 100644 --- a/README.md +++ b/README.md @@ -605,3 +605,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 652. Find Duplicate Subtrees | [Link](https://leetcode.com/problems/find-duplicate-subtrees/) | [Link](./lib/medium/652_find_duplicate_subtrees.rb) | [Link](./test/medium/test_652_find_duplicate_subtrees.rb) | | 654. Maximum Binary Tree | [Link](https://leetcode.com/problems/maximum-binary-tree/) | [Link](./lib/medium/654_maximum_binary_tree.rb) | [Link](./test/medium/test_654_maximum_binary_tree.rb) | | 659. Split Array into Consecutive Subsequences | [Link](https://leetcode.com/problems/split-array-into-consecutive-subsequences/) | [Link](./lib/medium/659_split_array_into_consecutive_subsequences.rb) | [Link](./test/medium/test_659_split_array_into_consecutive_subsequences.rb) | +| 662. Maximum Width of Binary Tree | [Link](https://leetcode.com/problems/maximum-width-of-binary-tree/) | [Link](./lib/medium/662_maximum_width_of_binary_tree.rb) | [Link](./test/medium/test_662_maximum_width_of_binary_tree.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 94c688e8..79eac456 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 = '7.4.0' + s.version = '7.4.1' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/662_maximum_width_of_binary_tree.rb b/lib/medium/662_maximum_width_of_binary_tree.rb new file mode 100644 index 00000000..ef0b3c75 --- /dev/null +++ b/lib/medium/662_maximum_width_of_binary_tree.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/maximum-width-of-binary-tree/ +# @param {TreeNode} root +# @return {Integer} +def width_of_binary_tree(root) + result = 1 + nodes = [::TreeNodePair.new(root, 0)] + until nodes.empty? + size = nodes.size + min = +1.0 / 0.0 + max = 0 + (0...size).each do |_i| + pair = nodes.delete_at(0) + min = [min, pair.value].min + max = [max, pair.value].max + + left = pair.node.left + right = pair.node.right + + nodes << ::TreeNodePair.new(left, pair.value * 2 + 1) if left + nodes << ::TreeNodePair.new(right, pair.value * 2 + 2) if right + end + + result = [result, max - min + 1].max + end + + result +end + +private + +# TreeNodePair +class TreeNodePair + attr_accessor :node, :value + + # @param {TreeNode} node + # @param {Integer} value + def initialize(node, value) + @node = node + @value = value + end +end diff --git a/test/medium/test_662_maximum_width_of_binary_tree.rb b/test/medium/test_662_maximum_width_of_binary_tree.rb new file mode 100644 index 00000000..0b85f0b8 --- /dev/null +++ b/test/medium/test_662_maximum_width_of_binary_tree.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/binary_tree' +require_relative '../../lib/medium/662_maximum_width_of_binary_tree' +require 'minitest/autorun' + +class MaximumWidthOfBinaryTreeTest < ::Minitest::Test + def test_default_one + assert_equal( + 4, + width_of_binary_tree( + ::TreeNode.new( + 1, + ::TreeNode.new( + 3, + ::TreeNode.new(5), + ::TreeNode.new(3) + ), + ::TreeNode.new( + 2, + nil, + ::TreeNode.new(9) + ) + ) + ) + ) + end + + def test_default_two + assert_equal( + 7, + width_of_binary_tree( + ::TreeNode.new( + 1, + ::TreeNode.new( + 3, + ::TreeNode.new( + 5, + ::TreeNode.new(6), + nil + ), + nil + ), + ::TreeNode.new( + 2, + nil, + ::TreeNode.new( + 9, + ::TreeNode.new(7), + nil + ) + ) + ) + ) + ) + end + + def test_default_three + assert_equal( + 2, + width_of_binary_tree( + ::TreeNode.new( + 1, + ::TreeNode.new( + 3, + ::TreeNode.new(5), + nil + ), + ::TreeNode.new(2) + ) + ) + ) + end +end