File tree Expand file tree Collapse file tree 4 files changed +136
-1
lines changed Expand file tree Collapse file tree 4 files changed +136
-1
lines changed Original file line number Diff line number Diff 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 ) |
Original file line number Diff line number Diff 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'
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments