Skip to content

Commit 1d3101b

Browse files
authored
2024-12-18 v. 7.3.8: added "652. Find Duplicate Subtrees"
2 parents d9a8afe + 725951a commit 1d3101b

File tree

4 files changed

+136
-1
lines changed

4 files changed

+136
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,3 +602,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/).
602602
| 641. Design Circular Deque | [Link](https://leetcode.com/problems/design-circular-deque/) | [Link](./lib/medium/641_design_circular_deque.rb) | [Link](./test/medium/test_641_design_circular_deque.rb) |
603603
| 647. Palindromic Substrings | [Link](https://leetcode.com/problems/palindromic-substrings/) | [Link](./lib/medium/647_palindromic_substrings.rb) | [Link](./test/medium/test_647_palindromic_substrings.rb) |
604604
| 648. Replace Words | [Link](https://leetcode.com/problems/replace-words/) | [Link](./lib/medium/648_replace_words.rb) | [Link](./test/medium/test_648_replace_words.rb) |
605+
| 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) |

leetcode-ruby.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ require 'English'
55
::Gem::Specification.new do |s|
66
s.required_ruby_version = '>= 3.0'
77
s.name = 'leetcode-ruby'
8-
s.version = '7.3.7'
8+
s.version = '7.3.8'
99
s.license = 'MIT'
1010
s.files = ::Dir['lib/**/*.rb'] + %w[README.md]
1111
s.executable = 'leetcode-ruby'
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# frozen_string_literal: true
2+
3+
# https://leetcode.com/problems/find-duplicate-subtrees/
4+
# @param {TreeNode} root
5+
# @return {TreeNode[]}
6+
def find_duplicate_subtrees(root)
7+
@duplicates = ::Set.new
8+
@nodes = {}
9+
10+
traverse_for_find_duplicate_subtrees(root)
11+
12+
@duplicates.to_a
13+
end
14+
15+
private
16+
17+
# @param {TreeNode} node
18+
# @return {String}
19+
def traverse_for_find_duplicate_subtrees(node)
20+
return '' unless node
21+
22+
left = traverse_for_find_duplicate_subtrees(node.left)
23+
right = traverse_for_find_duplicate_subtrees(node.right)
24+
curr = "#{left} #{right} #{node.val}"
25+
26+
if @nodes.include?(curr)
27+
@duplicates << @nodes[curr]
28+
else
29+
@nodes[curr] = node
30+
end
31+
32+
curr
33+
end
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../test_helper'
4+
require_relative '../../lib/common/binary_tree'
5+
require_relative '../../lib/medium/652_find_duplicate_subtrees'
6+
require 'minitest/autorun'
7+
8+
class FindDuplicateSubtreesTest < ::Minitest::Test
9+
def test_default_one
10+
result = find_duplicate_subtrees(
11+
::TreeNode.new(
12+
1,
13+
::TreeNode.new(
14+
2,
15+
::TreeNode.new(4),
16+
nil
17+
),
18+
::TreeNode.new(
19+
3,
20+
::TreeNode.new(
21+
2,
22+
::TreeNode.new(4),
23+
nil
24+
),
25+
::TreeNode.new(4)
26+
)
27+
)
28+
)
29+
30+
[
31+
::TreeNode.new(4),
32+
::TreeNode.new(
33+
2,
34+
::TreeNode.new(4),
35+
nil
36+
)
37+
].each_with_index do |node, index|
38+
assert(
39+
::TreeNode.are_equals(
40+
node,
41+
result[index]
42+
)
43+
)
44+
end
45+
end
46+
47+
def test_default_two
48+
result = find_duplicate_subtrees(
49+
::TreeNode.new(
50+
2,
51+
::TreeNode.new(1),
52+
::TreeNode.new(1)
53+
)
54+
)
55+
56+
[
57+
::TreeNode.new(1)
58+
].each_with_index do |node, index|
59+
assert(
60+
::TreeNode.are_equals(
61+
node,
62+
result[index]
63+
)
64+
)
65+
end
66+
end
67+
68+
def test_default_three
69+
result = find_duplicate_subtrees(
70+
::TreeNode.new(
71+
2,
72+
::TreeNode.new(
73+
2,
74+
::TreeNode.new(3),
75+
nil
76+
),
77+
::TreeNode.new(
78+
2,
79+
::TreeNode.new(3),
80+
nil
81+
)
82+
)
83+
)
84+
85+
[
86+
::TreeNode.new(3),
87+
::TreeNode.new(
88+
2,
89+
::TreeNode.new(3),
90+
nil
91+
)
92+
].each_with_index do |node, index|
93+
assert(
94+
::TreeNode.are_equals(
95+
node,
96+
result[index]
97+
)
98+
)
99+
end
100+
end
101+
end

0 commit comments

Comments
 (0)