Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ต้นไม้ไบนารีแบบเต็มที่เป็นไปได้ทั้งหมดใน C ++


สมมติว่าต้นไม้ไบนารีแบบเต็มเป็นต้นไม้ไบนารีโดยที่แต่ละโหนดมีลูก 0 หรือ 2 ลูกพอดี ดังนั้นเราจึงต้องหารายการต้นไม้ไบนารีแบบเต็มที่เป็นไปได้ทั้งหมดที่มีโหนด N แต่ละโหนดของต้นไม้แต่ละต้นในคำตอบจะต้องมี node.val =0 ต้นไม้ที่ส่งคืนสามารถอยู่ในลำดับใดก็ได้ ดังนั้นหากอินพุตคือ 7 ต้นไม้จะเป็น −

ต้นไม้ไบนารีแบบเต็มที่เป็นไปได้ทั้งหมดใน C ++

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดแผนที่ m ของคีย์ประเภทจำนวนเต็มและค่าประเภทต้นไม้

  • กำหนดวิธีการที่เรียกว่า allPossibleFBT() ซึ่งจะใช้ N เป็นอินพุต

  • คือ N คือ 1 จากนั้นสร้างทรีที่มีหนึ่งโหนดที่มีค่าเป็น 0 และส่งคืน

  • ถ้า m มีคีย์ N ให้คืนค่า m[N]  กำหนดอาร์เรย์ที่เรียกว่า temp และ req :=N – 1

  • สำหรับเหลืออยู่ในช่วง 1 ถึง req – 1

    • ขวา :=req – ซ้าย

    • ถ้าซ้าย =2 หรือขวา =2 ให้ทำซ้ำต่อไป

    • leftPart :=allPossibleFBT(ซ้าย), rightPart :=allPossibleFBT(ขวา)

    • สำหรับ j ในช่วง 0 ถึงขนาด leftPart - 1

      • สำหรับ k ในช่วง 0 ถึงขนาดของ rightPart – 1

        • root :=โหนดใหม่ที่มีค่า 0

        • ทางซ้ายของรูท :=leftPart[j], ทางขวาของรูท :=rightPart[k]

        • แทรกรูทลงใน ans

  • set m[N] :=ans และ return.

ตัวอย่าง(C++)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include ใช้เนมสเปซ std;คลาส TreeNode{ สาธารณะ:int val; TreeNode *ซ้าย *ขวา; TreeNode (ข้อมูล int) { val =data; ซ้าย =ขวา =NULL; }};เป็นโมฆะ tree_level_trav(TreeNode*root){ ถ้า (root ==NULL) กลับมา; ศาล <<"["; คิว q; TreeNode * สกุลเงิน; q.push(ราก); q.push(โมฆะ); ในขณะที่ (q.size()> 1) {curr =q.front(); q.ป๊อป(); ถ้า (curr ==NULL) { q.push (NULL); } อื่น { if(curr->left) q.push(curr->left); if(curr->right) q.push(curr->right); if(curr ==NULL || curr->val ==0){ cout <<"null" <<", "; } อื่น { cout <val <<", "; } } } cout <<"]"<> m; vector allPossibleFBT(int N) { if(N ==1){ vector  อุณหภูมิ; TreeNode *n =TreeNode ใหม่ (1); n->left =TreeNode ใหม่ (0); n->right =ใหม่ TreeNode(0); temp.push_back(n); กลับอุณหภูมิ; } if(m.count(N))กลับ m[N]; เวกเตอร์  ตอบ; int ที่ต้องการ =N - 1; สำหรับ (int ซ้าย =1; ซ้าย <จำเป็น ซ้าย ++) { int ขวา =จำเป็น - ซ้าย; ถ้า (ซ้าย ==2 || ขวา ==2) ดำเนินการต่อ; เวกเตอร์  leftPart =allPossibleFBT(ซ้าย); เวกเตอร์  rightPart =allPossibleFBT(ขวา); สำหรับ(int j =0; j left =leftPart[j]; root->right =rightPart[k]; ans.push_back(ราก); } } } return m[N] =ans; }};main(){ เวกเตอร์ v; โซลูชัน ob; v =(ob.allPossibleFBT(7)); สำหรับ (TreeNode *t :v){ tree_level_trav(t); }}

อินพุต

7

ผลลัพธ์

<ก่อนหน้า>[1, 1, 1, null, null, 1, 1, null, null, 1, 1, null, null, null, null, ][1, 1, 1, null, null, 1, 1, 1, 1, โมฆะ, โมฆะ, โมฆะ, โมฆะ, โมฆะ, โมฆะ, ][1, 1, 1, 1, 1, 1, 1, โมฆะ, โมฆะ, โมฆะ, โมฆะ, โมฆะ, โมฆะ, โมฆะ, โมฆะ, ][ 1, 1, 1, 1, 1, null, null, null, null, 1, 1, null, null, null, null, ][1, 1, 1, 1, 1, null, null, 1, 1, โมฆะ, null, null, null, null, null, ]