problemscpp
A collection of my answers to algorithm problems in c++.
| 函数
pat::a::a7_4 命名空间参考

7-4 Pseudo-completeness 更多...

struct  Node
 

函数

NodegenTree (const vector< int > &preorder, const vector< int > &inorder, int pStart, int pEnd, int iStart, int iEnd)
 
int judge (Node *node)
 
int main (istream &cin, ostream &cout)
 
void postOrder (Node *node, vector< int > &vec)
 
 TEST (a7_4, case1)
 
 TEST (a7_4, case2)
 
 TEST (a7_4, case3)
 
 TEST (a7_4, case4)
 

详细描述

7-4 Pseudo-completeness

函数说明

◆ genTree()

Node * pat::a::a7_4::genTree ( const vector< int > &  preorder,
const vector< int > &  inorder,
int  pStart,
int  pEnd,
int  iStart,
int  iEnd 
)

在文件 pat.cpp5213 行定义.

5214 {
5215 if(pStart > pEnd || iStart > iEnd) {
5216 return nullptr;
5217 }
5218 const int root = preorder[pStart];
5219 auto *node = new Node(root);
5220 unordered_set<int> lefts;
5221 int iLeftEnd = iStart;
5222 while(inorder[iLeftEnd] != root) {
5223 lefts.insert(inorder[iLeftEnd++]);
5224 }
5225 iLeftEnd--;
5226 const int iRightStart = iLeftEnd + 2;
5227 int pLeftEnd = pStart + 1;
5228 while(pLeftEnd < preorder.size() && lefts.contains(preorder[pLeftEnd])) {
5229 pLeftEnd++;
5230 }
5231 node->left = genTree(preorder, inorder, pStart + 1, pLeftEnd - 1, iStart, iLeftEnd);
5232 node->right = genTree(preorder, inorder, pLeftEnd, pEnd, iRightStart, iEnd);
5233 return node;
5234 }
vector< int > root
Definition: acwing408.cpp:349
Node * genTree(const vector< int > &preorder, const vector< int > &inorder, int pStart, int pEnd, int iStart, int iEnd)
Definition: pat.cpp:5213

引用了 genTree() , 以及 acwing::acwing836_408::root.

被这些函数引用 genTree() , 以及 main().

◆ judge()

int pat::a::a7_4::judge ( Node node)

在文件 pat.cpp5246 行定义.

5246 {
5247 map<int, int> m;
5248 vector<vector<Node *>> lvs;
5249 queue<pair<int, Node *>> q;
5250 q.push({0, node});
5251 while(!q.empty()) {
5252 const auto p = q.front();
5253 q.pop();
5254 const int level = p.first;
5255 m[level]++;
5256 while(lvs.size() < level + 1) {
5257 vector<Node *> topush;
5258 lvs.push_back(topush);
5259 }
5260 Node *n = p.second;
5261 lvs[level].push_back(n);
5262 if(n->left != nullptr) {
5263 q.push({level + 1, n->left});
5264 }
5265 if(n->right != nullptr) {
5266 q.push({level + 1, n->right});
5267 }
5268 }
5269 for(const auto kv: m) {
5270 const int k = kv.first;
5271 const int v = kv.second;
5272 if(k != m.rbegin()->first) {
5273 if(v != pow(2, k)) {
5274 return 0;
5275 }
5276 } else {
5277 if(v == pow(2, k)) {
5278 return 1;
5279 }
5280 if(lvs.size() >= 2) {
5281 bool haveEmpty = false;
5282 for(const auto &nd: lvs[lvs.size() - 2]) {
5283 if(nd->left == nullptr) {
5284 haveEmpty = true;
5285 } else {
5286 if(haveEmpty) {
5287 return 3;
5288 }
5289 }
5290 if(nd->right == nullptr) {
5291 haveEmpty = true;
5292 } else {
5293 if(haveEmpty) {
5294 return 3;
5295 }
5296 }
5297 }
5298 }
5299 return 2;
5300 }
5301 }
5302 return -1;
5303 }

引用了 pat::a::a7_4::Node::left , 以及 pat::a::a7_4::Node::right.

被这些函数引用 main().

◆ main()

int pat::a::a7_4::main ( istream &  cin,
ostream &  cout 
)

在文件 pat.cpp5305 行定义.

5305 {
5306 int n;
5307 cin >> n;
5308 vector<int> inorder(n);
5309 vector<int> preorder(n);
5310 for(int i = 0; i < n; i++) {
5311 cin >> inorder[i];
5312 }
5313 for(int i = 0; i < n; i++) {
5314 cin >> preorder[i];
5315 }
5316 Node *root = genTree(preorder, inorder, 0, n - 1, 0, n - 1);
5317 vector<int> vec;
5318 cout << judge(root) << endl;
5319 postOrder(root, vec);
5320 for(int i = 0; i < vec.size(); i++) {
5321 cout << vec[i];
5322 if(i != vec.size() - 1) {
5323 cout << ' ';
5324 }
5325 }
5326 return 0;
5327 }
int vec[100010]
Definition: pat.cpp:5095
void postOrder(Node *node, vector< int > &vec)
Definition: pat.cpp:5236
int judge(Node *node)
Definition: pat.cpp:5246

引用了 genTree(), judge(), postOrder(), acwing::acwing836_408::root , 以及 pat::a::a7_2::vec.

被这些函数引用 TEST().

◆ postOrder()

void pat::a::a7_4::postOrder ( Node node,
vector< int > &  vec 
)

在文件 pat.cpp5236 行定义.

5236 {
5237 if(node->left != nullptr) {
5238 postOrder(node->left, vec);
5239 }
5240 if(node->right != nullptr) {
5241 postOrder(node->right, vec);
5242 }
5243 vec.emplace_back(node->val);
5244 }
Node * right
Definition: pat.h:992
Node * left
Definition: pat.h:991

引用了 pat::a::a7_4::Node::left, postOrder(), pat::a::a7_4::Node::right, pat::a::a7_4::Node::val , 以及 pat::a::a7_2::vec.

被这些函数引用 main() , 以及 postOrder().

◆ TEST() [1/4]

pat::a::a7_4::TEST ( a7_4  ,
case1   
)

在文件 pat_test.cpp2356 行定义.

2356 {
2357 istringstream in("7\n"
2358 "4 2 5 1 6 3 7\n"
2359 "1 2 4 5 3 6 7");
2360 auto out = ostringstream();
2361 main(in, out);
2362 ASSERT_EQ("1\n"
2363 "4 5 2 6 7 3 1",
2364 out.str());
2365 }
int main(int argc, char **argv)
Definition: main.cpp:5

引用了 main().

◆ TEST() [2/4]

pat::a::a7_4::TEST ( a7_4  ,
case2   
)

在文件 pat_test.cpp2367 行定义.

2367 {
2368 istringstream in("10\n"
2369 "8 4 9 2 10 5 1 6 3 7\n"
2370 "1 2 4 8 9 5 10 3 6 7");
2371 auto out = ostringstream();
2372 main(in, out);
2373 ASSERT_EQ("2\n"
2374 "8 9 4 10 5 2 6 7 3 1",
2375 out.str());
2376 }

引用了 main().

◆ TEST() [3/4]

pat::a::a7_4::TEST ( a7_4  ,
case3   
)

在文件 pat_test.cpp2378 行定义.

2378 {
2379 istringstream in("10\n"
2380 "8 4 2 5 11 1 6 3 14 7\n"
2381 "1 2 4 8 5 11 3 6 7 14");
2382 auto out = ostringstream();
2383 main(in, out);
2384 ASSERT_EQ("3\n"
2385 "8 4 11 5 2 6 14 7 3 1",
2386 out.str());
2387 }

引用了 main().

◆ TEST() [4/4]

pat::a::a7_4::TEST ( a7_4  ,
case4   
)

在文件 pat_test.cpp2389 行定义.

2389 {
2390 istringstream in("7\n"
2391 "4 2 10 5 1 3 7\n"
2392 "1 2 4 5 10 3 7");
2393 auto out = ostringstream();
2394 main(in, out);
2395 ASSERT_EQ("0\n"
2396 "4 10 5 2 7 3 1",
2397 out.str());
2398 }

引用了 main().