diff --git a/README.md b/README.md index da41b8b8..98fbeba0 100644 --- a/README.md +++ b/README.md @@ -650,3 +650,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 126. Word Ladder II | [Link](https://leetcode.com/problems/word-ladder-ii/) | [Link](./lib/hard/126_word_ladder_ii.rb) | [Link](./test/hard/test_126_word_ladder_ii.rb) | | 233. Number of Digit One | [Link](https://leetcode.com/problems/number-of-digit-one/) | [Link](./lib/hard/233_number_of_digit_one.rb) | [Link](./test/hard/test_233_number_of_digit_one.rb) | | 239. Sliding Window Maximum | [Link](https://leetcode.com/problems/sliding-window-maximum/) | [Link](./lib/hard/239_sliding_window_maximum.rb) | [Link](./test/hard/test_239_sliding_window_maximum.rb) | +| 297. Serialize and Deserialize Binary Tree | [Link](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/) | [Link](./lib/hard/297_serialize_and_deserialize_binary_tree.rb) | [Link](./test/hard/test_297_serialize_and_deserialize_binary_tree.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 3915f243..4eef5154 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.8.0' + s.version = '7.8.1' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/hard/297_serialize_and_deserialize_binary_tree.rb b/lib/hard/297_serialize_and_deserialize_binary_tree.rb new file mode 100644 index 00000000..e71e0548 --- /dev/null +++ b/lib/hard/297_serialize_and_deserialize_binary_tree.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/serialize-and-deserialize-binary-tree/ +# @param {TreeNode} root +# @return {String} +def serialize_binary_tree(root) + preorder = + lambda do |node| + return [nil] unless node + + [node.val] + preorder.call(node.left) + preorder.call(node.right) + end + + preorder.call(root).to_json +end + +# @param {String} data +# @return {TreeNode} +def deserialize_binary_tree(data) + return if data.empty? + + helper = + lambda do |preorder| + return if preorder.empty? + + current = preorder.shift + + return unless current + + root = ::TreeNode.new(current) + root.left = helper.call(preorder) + root.right = helper.call(preorder) + + root + end + + helper.call(::JSON.parse(data)) +end diff --git a/test/hard/test_297_serialize_and_deserialize_binary_tree.rb b/test/hard/test_297_serialize_and_deserialize_binary_tree.rb new file mode 100644 index 00000000..810e97a6 --- /dev/null +++ b/test/hard/test_297_serialize_and_deserialize_binary_tree.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/binary_tree' +require_relative '../../lib/hard/297_serialize_and_deserialize_binary_tree' +require 'minitest/autorun' + +class SerializeAndDeserializeBinaryTreeTest < ::Minitest::Test + def test_default_one + assert( + ::TreeNode.are_equals( + ::TreeNode.new( + 1, + ::TreeNode.new(2), + ::TreeNode.new( + 3, + ::TreeNode.new(4), + ::TreeNode.new(5) + ) + ), + deserialize_binary_tree( + serialize_binary_tree( + ::TreeNode.new( + 1, + ::TreeNode.new(2), + ::TreeNode.new( + 3, + ::TreeNode.new(4), + ::TreeNode.new(5) + ) + ) + ) + ) + ) + ) + end + + def test_default_two + assert( + ::TreeNode.are_equals( + nil, + deserialize_binary_tree( + serialize_binary_tree( + nil + ) + ) + ) + ) + end +end