Advertisement
Alexxik

Untitled

Mar 19th, 2024
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.31 KB | None | 0 0
  1. // MARK: - Найти 2 одинаковых поддерева
  2.  
  3. /*
  4. Нахождение эквивалентных поддеревьев:
  5. для каждой вершины находим множество как объединение
  6. множеств детей и своего значения
  7.  
  8. Добавляем в словарь, где ключ - множество, а значение список вершин с таким множеством
  9. Если в словаре есть список из двух и более значений, то искомые вершины найдены
  10. */
  11.  
  12.  
  13.  
  14. func findEquivalentSubtrees(root: Node?) -> (Node?, Node?) {
  15.    
  16.     var nodesSets = [Set<Character>: [Node]]()
  17.  
  18.     func findSet(node: Node?) -> Set<Character> {
  19.         var resultSet = Set<Character>()
  20.         guard let node = node else { return resultSet }
  21.    
  22.         resultSet.insert(node.value)
  23.         resultSet = resultSet.union(findSet(node: node.left))
  24.         resultSet = resultSet.union(findSet(node: node.right))
  25.        
  26.         nodesSets[resultSet, default: []].append(node)
  27.         return resultSet
  28.     }
  29.  
  30.     _ = findSet(node: root)
  31.  
  32.     for value in nodesSets.values {
  33.         if value.count > 1 {
  34.             return (value[0], value[1])
  35.         }
  36.     }
  37.     return (nil, nil)
  38. }
  39.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement