เราได้รับอาร์เรย์ arr[] ที่มีการส่งผ่านคำสั่งล่วงหน้าของทรี k-ary ตามลำดับ เป้าหมายคือการสร้างต้น k-ary เดียวกันจากนั้นพิมพ์การข้ามผ่านรายการภายหลัง ต้นไม้ k−ary แบบเต็มคือต้นไม้ที่โหนดรูทมีลูก 0 หรือ k ลูก เช่น มากที่สุด k ลูก
ตัวอย่าง
อินพุต
int arr[] = {2, 5, 1, 3, 6, 7, 2, 1 }, int size = 8, int children = 2 ผลลัพธ์
ต้นไม้ k−ary เต็มรูปแบบซึ่งจะสร้างโดยเด็กสองคนจากการข้ามเส้นทางล่วงหน้าจะได้รับด้านล่าง -

คำอธิบาย
เราได้รับอาร์เรย์ของค่าจำนวนเต็มหรือการข้ามผ่านคำสั่งล่วงหน้าของ atree ที่มีลูก k ซึ่งก็คือ 2 ดังนั้น ต้นไม้ที่ก่อตัวขึ้นจะมีการข้ามผ่านภายหลังเป็น 3 6 1 2 1 7 5 2 ซึ่งสร้างขึ้นตามกฎที่ระบุว่า เยี่ยมชมโหนดทรีย่อย LEFT ทั้งหมด จากนั้นไปที่โหนดทรีย่อยขวาทั้งหมด จากนั้นไปที่โหนดรูททั้งหมด
อินพุต
int arr[] = {2, 5, 1, 3, 6, 7, 2, 1 }, int size = 8, int children = 3 ผลลัพธ์
ต้นไม้ k−ary เต็มรูปแบบซึ่งจะสร้างด้วยลูกสามคนจากการข้ามเส้นทางล่วงหน้าจะได้รับด้านล่าง -

คำอธิบาย
เราได้รับอาร์เรย์ของค่าจำนวนเต็มหรือการข้ามผ่านของคำสั่งล่วงหน้าของ atree ที่มีลูก k ซึ่งก็คือ 3 ดังนั้น ต้นไม้ที่ก่อตัวขึ้นจะมีการข้ามผ่านภายหลังเป็น 3 6 1 2 1 7 5 2 ซึ่งสร้างขึ้นตามกฎที่ระบุว่า เยี่ยมชมโหนดทรีย่อย LEFT ทั้งหมด จากนั้นไปที่โหนดทรีย่อยขวาทั้งหมด จากนั้นไปที่โหนดรูททั้งหมด
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้ −
ในแนวทางนี้ ก่อนอื่นเราจะสร้าง k-ary tree จากอาร์เรย์ที่กำหนดโดยใช้องค์ประกอบแรกเป็นโหนดรูท หากทรีย่อยด้านซ้ายว่างเปล่า ทรีย่อยด้านขวาก็จะว่างเปล่าด้วย เรียกทรีย่อยซ้ายและขวาซ้ำแล้วซ้ำอีก สำหรับการข้ามผ่านคำสั่งภายหลัง เราใช้ทรีย่อยทางซ้าย จากนั้นทรีย่อยทางขวา จากนั้นพิมพ์น้ำหนักของโหนด
-
โทรสั่ง (root−>left)
-
โทรสั่ง (root->ขวา)
-
พิมพ์ root->data
-
ใช้ arr[] เป็นอาร์เรย์อินพุตที่มีการส่งผ่านคำสั่งล่วงหน้า
-
ใช้ k เป็นเด็กตัวแปร
-
ใช้ดัชนีเริ่มต้นเป็น count=0
-
สร้างแผนผังโดยใช้ Tree_Node* node =create_tree(arr, size, children, count)
-
ฟังก์ชัน new_Node(ข้อมูล int) สร้างโหนดใหม่ของต้นไม้
-
ฟังก์ชัน create_tree(int arr[], int N, int k, int height, int&count) สร้าง kary tree จากอาร์เรย์ arr[].
-
หากจำนวนโหนดเป็น <=0 ให้คืนค่า NULL จะไม่สามารถสร้างแผนผังได้
-
เริ่มต้น newNode =new_Node(arr[count]) องค์ประกอบแรกของ arr[]
-
ถ้า (newNode ==NULL) ให้ผลลัพธ์เป็น จริง จะไม่มีแผนผังใดเกิดขึ้นได้
-
Traverse arr[] ใช้ for loop จาก i=0 ถึง i
-
ถ้า (นับ
1) ให้เพิ่มจำนวนสำหรับดัชนีถัดไปและเพิ่มโหนดนี้ในทรีโดยใช้ newNode−>root.push_back(create_tree(arr, N, k, height − 1, count))พี> -
มิฉะนั้นจะสิ้นสุดทรีด้วยการกด NULL โดยใช้ newNode−>root.push_back(NULL);
-
ในตอนท้าย ให้คืนตัวชี้ไปที่โหนด
-
ฟังก์ชัน create_tree(int* arr, int N, int k, int count) คืนค่าความสูงของต้นไม้
-
คำนวณความสูง=(int)ceil(log((double)N * (k − 1) + 1) / log((double)k));
-
เรียก create_tree(arr, N, k, height, count) ในคำสั่ง return สำหรับ tree ที่ความสูงคำนวณด้านบน
-
ฟังก์ชัน postorder_traversal(โหนด Tree_Node*, int k) พิมพ์การสั่งซื้อล่วงหน้าของต้นไม้ k−ary ที่รูทที่โหนด
-
หากโหนดเป็น NULL จะไม่ส่งคืนสิ่งใด
-
สำรวจโดยใช้ for loop จาก i=0 ถึง i
root[i], k); -
พิมพ์ node->address ที่ส่วนท้ายของ for loop.
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
struct Tree_Node{
int address;
vector<Tree_Node*> root;
};
Tree_Node* new_Node(int data){
Tree_Node* newNode = new Tree_Node;
newNode−>address = data;
return newNode;
}
Tree_Node* create_tree(int arr[], int N, int k, int height, int& count){
if(N <= 0){
return NULL;
}
Tree_Node* newNode = new_Node(arr[count]);
if (newNode == NULL){
cout<<"Code Dumped";
return NULL;
}
for(int i = 0; i < k; i++){
if (count < N − 1 && height > 1){
count++;
newNode−>root.push_back(create_tree(arr, N, k, height − 1, count));
}else{
newNode−>root.push_back(NULL);
}
}
return newNode;
}
Tree_Node* create_tree(int* arr, int N, int k, int count){
int height = (int)ceil(log((double)N * (k − 1) + 1) / log((double)k));
return create_tree(arr, N, k, height, count);
}
void preorder_traversal(Tree_Node* node, int k){
if (node == NULL){
return;
}
for(int i = 0; i < k; i++){
preorder_traversal(node−>root[i], k);
}
cout<<node−>address<< " ";
}
int main(){
int arr[] = {2, 5, 1, 3, 6, 7, 2, 1 };
int size = 8;
int children = 2;
int count = 0;
Tree_Node* node = create_tree(arr, size, children, count);
cout<<"Construct the full k−ary tree from its preorder traversal are: ";
preorder_traversal(node, children);
return 0;
} ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Construct the full k-ary tree from its preorder traversal are: 3 6 1 2 1 7 5 2