Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ Bundler/GemComment:

Metrics/AbcSize:
Enabled: false
Metrics/ClassLength:
Enabled: false
Metrics/MethodLength:
Enabled: false
Metrics/CyclomaticComplexity:
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -576,3 +576,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/).
| 443. String Compression | [Link](https://leetcode.com/problems/string-compression/) | [Link](./lib/medium/443_string_compression.rb) | [Link](./test/medium/test_443_string_compression.rb) |
| 445. Add Two Numbers II | [Link](https://leetcode.com/problems/add-two-numbers-ii/) | [Link](./lib/medium/445_add_two_numbers_ii.rb) | [Link](./test/medium/test_445_add_two_numbers_ii.rb) |
| 449. Serialize and Deserialize BST | [Link](https://leetcode.com/problems/serialize-and-deserialize-bst/) | [Link](./lib/medium/449_serialize_and_deserialize_bst.rb) | [Link](./test/medium/test_449_serialize_and_deserialize_bst.rb) |
| 450. Delete Node in a BST | [Link](https://leetcode.com/problems/delete-node-in-a-bst/) | [Link](./lib/medium/450_delete_node_in_a_bst.rb) | [Link](./test/medium/test_450_delete_node_in_a_bst.rb) |
2 changes: 1 addition & 1 deletion leetcode-ruby.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ require 'English'
::Gem::Specification.new do |s|
s.required_ruby_version = '>= 3.0'
s.name = 'leetcode-ruby'
s.version = '7.1.0'
s.version = '7.1.1'
s.license = 'MIT'
s.files = ::Dir['lib/**/*.rb'] + %w[README.md]
s.executable = 'leetcode-ruby'
Expand Down
4 changes: 2 additions & 2 deletions lib/common/binary_tree.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ def initialize(val = 0, left = nil, right = nil)
# @param {TreeNode} other
# @return {Boolean}
def self.are_equals(curr, other)
return true if curr.nil? && other.nil?
return false if curr.nil? || other.nil?
return true if !curr && !other
return false if !curr || !other

curr_eq = curr.val == other.val
left_eq = are_equals(curr.left, other.left)
Expand Down
45 changes: 45 additions & 0 deletions lib/medium/450_delete_node_in_a_bst.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# frozen_string_literal: true

# https://leetcode.com/problems/delete-node-in-a-bst/
# @param {TreeNode} root
# @param {Integer} key
# @return {TreeNode}
def delete_node450(root, key)
return unless root

if key > root.val
root.right = delete_node450(root.right, key)
elsif key < root.val
root.left = delete_node450(root.left, key)
elsif !root.left && !root.right
root = nil
elsif root.right
root.val = successor(root)
root.right = delete_node450(root.right, root.val)
else
root.val = predecessor(root)
root.left = delete_node450(root.left, root.val)
end

root
end

private

# @param {TreeNode} node
# @return {Integer}
def successor(node)
node = node.right
node = node.left while node.left

node.val
end

# @param {TreeNode} node
# @return {Integer}
def predecessor(node)
node = node.left
node = node.right while node.right

node.val
end
128 changes: 128 additions & 0 deletions test/medium/test_450_delete_node_in_a_bst.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# frozen_string_literal: true

require_relative '../test_helper'
require_relative '../../lib/common/binary_tree'
require_relative '../../lib/medium/450_delete_node_in_a_bst'
require 'minitest/autorun'

class DeleteNodeInABSTTest < ::Minitest::Test
def test_default_one
assert(
::TreeNode.are_equals(
::TreeNode.new(
5,
::TreeNode.new(
4,
::TreeNode.new(2),
nil
),
::TreeNode.new(
6,
nil,
::TreeNode.new(7)
)
),
delete_node450(
::TreeNode.new(
5,
::TreeNode.new(
3,
::TreeNode.new(2),
::TreeNode.new(4)
),
::TreeNode.new(
6,
nil,
::TreeNode.new(7)
)
),
3
)
)
)
end

def test_default_two
assert(
::TreeNode.are_equals(
::TreeNode.new(
5,
::TreeNode.new(
2,
nil,
::TreeNode.new(4)
),
::TreeNode.new(
6,
nil,
::TreeNode.new(7)
)
),
delete_node450(
::TreeNode.new(
5,
::TreeNode.new(
2,
nil,
::TreeNode.new(4)
),
::TreeNode.new(
6,
nil,
::TreeNode.new(7)
)
),
0
)
)
)
end

def test_default_three
assert(
::TreeNode.are_equals(
nil,
delete_node450(
nil,
0
)
)
)
end

def test_additional_one
assert(
::TreeNode.are_equals(
::TreeNode.new(
10,
::TreeNode.new(10),
::TreeNode.new(10)
),
delete_node450(
::TreeNode.new(
10,
::TreeNode.new(10),
::TreeNode.new(10)
),
20
)
)
)
end

def test_additional_two
assert(
::TreeNode.are_equals(
::TreeNode.new(10),
delete_node450(
::TreeNode.new(
8,
::TreeNode.new(10),
nil
),
8
)
)
)
end
end