vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
     unordered_map<string, vector<TreeNode*> > mp;
     seralize(root, mp);
     vector<TreeNode*> result;
     for (auto& item : mp) {
         if (item.second.size() > 1)
             result.push_back(item.second[0]);
     }
     return result;
 }
示例#2
0
  void length_packer::pack(net_buffer &oSendBuffer, const package_ptr &pkg) {
    marshaler lr(marshaler::length_retriver);

    pkg->arch(lr);
    uint32_t len = lr.getLength();

    oSendBuffer.reserve_idle(static_cast<size_t>(len + sizeof(len)));
    char *pBuf = asio::buffer_cast<char *>(oSendBuffer.writeable());
    seralize(len, pBuf);
    oSendBuffer.filled() += sizeof(len);
    pBuf = asio::buffer_cast<char *>(oSendBuffer.writeable());
    marshaler s(pBuf, oSendBuffer.idle(), marshaler::seralizer);
    pkg->arch(s);
    oSendBuffer.filled() += len;
    LOG(INFO) << "length_packer::bond(), seralize pkg: "
      << print_buf(asio::buffer_cast<const char *>(oSendBuffer.readable()),
          oSendBuffer.filled());
  }
 string seralize(TreeNode* root, unordered_map<string, vector<TreeNode*> >& mp) {
     if (!root) return "";
     string key = '(' + seralize(root->left, mp) + ')' + to_string(root->val) + '(' + seralize(root->right, mp) + ')';
     mp[key].push_back(root);
     return key;
 }