9
9
import java .util .stream .Collectors ;
10
10
11
11
/**
12
+ * <pre>
12
13
* Дано бинарное дерево с выделенным корнем, в каждой вершине которого записано по одной букве A-Z.
13
- * Две вершины считаются эквивалентными, если поддеревья этих вершин содержат одинаковое множество (т.е. без учета частот) букв.
14
+ * Две вершины считаются эквивалентными, если поддеревья этих вершин содержат одинаковое множество
15
+ * (т.е. без учета частот) букв.
14
16
* Нужно найти две эквивалентные вершины с максимальным суммарным размером поддеревьев.
15
- * <pre>
17
+ *
16
18
* public class Node {
17
19
* char value; // [A-Z]
18
20
* Node left;
@@ -38,10 +40,9 @@ public List<Node> findEquivalentSubtrees(Node root) {
38
40
// Build Set<Character> -> List<Node> map
39
41
Map <Set <Character >, List <Node >> voc2Nodes = new HashMap <>();
40
42
node2Voc = node2Voc .entrySet ().stream ()
41
- // .filter(nodeSetEntry -> !nodeSetEntry.getValue().isEmpty())
42
43
.collect (Collectors .toMap (
43
- entry -> entry . getKey () ,
44
- entry -> entry . getValue ()
44
+ Map . Entry :: getKey ,
45
+ Map . Entry :: getValue
45
46
));
46
47
47
48
for (Node node : node2Voc .keySet ()) {
@@ -57,7 +58,7 @@ public List<Node> findEquivalentSubtrees(Node root) {
57
58
voc2Nodes = voc2Nodes .entrySet ().stream ()
58
59
.filter (entry -> entry .getValue ().size () >= 2 )
59
60
.collect (Collectors .toMap (
60
- entry -> entry . getKey () ,
61
+ Map . Entry :: getKey ,
61
62
entry -> entry .getValue ().stream ()
62
63
.sorted ((o1 , o2 ) -> node2Size .get (o2 ) - node2Size .get (o1 ))
63
64
.limit (2 )
@@ -73,16 +74,16 @@ public List<Node> findEquivalentSubtrees(Node root) {
73
74
.sorted ((o1 , o2 ) -> o2 .getValue ().stream ().mapToInt (node2Size ::get ).sum () - o1 .getValue ().stream ().mapToInt (node2Size ::get ).sum ())
74
75
.limit (1 )
75
76
.collect (Collectors .toMap (
76
- entry -> entry . getKey () ,
77
- entry -> entry . getValue ()
77
+ Map . Entry :: getKey ,
78
+ Map . Entry :: getValue
78
79
));
79
80
80
- return ( List < Node >) map .values ().toArray ()[ 0 ] ;
81
+ return map .values ().iterator (). next () ;
81
82
}
82
83
83
84
private Set <Character > buildNodeVocabulary (Node node , Map <Node , Set <Character >> node2Voc ) {
84
85
if (!node2Voc .containsKey (node )) {
85
- node2Voc .put (node , new HashSet ());
86
+ node2Voc .put (node , new HashSet <> ());
86
87
}
87
88
if (node .left != null ) {
88
89
node2Voc .get (node ).add (node .left .value );
0 commit comments