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; }
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; }