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