Advertisement
pochti_da

Untitled

Jun 27th, 2024
315
0
4 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. // Дано бинарное дерево с выделенным корнем, в каждой вершине которого записано по одной букве A-Z.
  2. // Две вершины считаются эквивалентными, если поддеревья этих вершин содержат одинаковое
  3. // множество (т.е. без учета частот) букв.
  4. // нужно найти любую пару эквивалентных вершин.
  5.  
  6.  
  7. struct TNode {
  8.     char Value;  // [A-Z]
  9.     TNode* Left;
  10.     TNode* Right;
  11. };
  12.  
  13. using TLetterSet = std::array<bool, 26>;
  14.  
  15. std::string GenerateKey(const TLetterSet &letters)
  16. {
  17.     std::string result;
  18.     for (size_t i = 0; i < letter.size(); ++i)
  19.     {
  20.         if (letters[i])
  21.         {
  22.             result += ('A' + i);
  23.         }
  24.     }
  25.  
  26.     return result;
  27. }
  28.  
  29. TLetterSet GenerateLettersForSubTree(const TNode *node, std::unordered_map<std::string, std::vector<TNode *>> &nodesKeys)
  30. {
  31.     if (!node)
  32.     {
  33.         TLetterSet falseSet;
  34.         for (size_t i = 0; i < falseSet.size(); ++i)
  35.         {
  36.             falseSet[i] = false;
  37.         }
  38.  
  39.         return falseSet;
  40.     }
  41.  
  42.     const auto leftLetters = GenerateLettersForSubTree(node->Left);
  43.     const auto rightLetters = GenerateLettersForSubTree(node->Right);
  44.  
  45.     TLetterSet nodeLetters;
  46.     for (size_t i = 0; i < nodeLetters.size(); ++i)
  47.     {
  48.         nodeLetters[i] = leftLetters[i] || rightLetters[i];
  49.     }
  50.     nodesLetters[node->Value - 'A'] = true;
  51.  
  52.     const auto nodeKey = GenerateKey(nodeLetters);
  53.     nodesKeys[nodeKey].push_back(node);
  54.  
  55.     return nodesLetters;
  56. }
  57.  
  58. std::pair<TNode*, TNode*> FindEquivalentSubtrees(TNode* root)
  59. {
  60.     std::unordered_set<std::string, std::vector<TNode *>> nodesKeys;
  61.     GenerateLettersForSubTree(root, nodesKeys);
  62.  
  63.     for (const auto &[key, nodes] : nodesKeys)
  64.     {
  65.         if (nodes.size() > 1)
  66.         {
  67.             return {nodes[0], nodes[1]};
  68.         }
  69.     }
  70.  
  71.     return {nullptr, nullptr};
  72. }
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement