ในปัญหานี้ เราได้รับไบนารีทรีและจำนวนเต็ม K และเราต้องพิมพ์โหนดทั้งหมดของไบนารีทรีที่มี K ออกจากทรีย่อยย่อย
ต้นไม้ไบนารี เป็นต้นไม้พิเศษที่แต่ละโหนดมีโหนดสูงสุดสองโหนด (หนึ่ง/สอง/ไม่มี)
โหนดลีฟ ของไบนารีทรีคือโหนดที่ส่วนท้ายของทรี
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน −
K =2
ผลลัพธ์ − {ส}
เพื่อแก้ปัญหานี้ เราจะทำการข้าม (postorder) สำหรับต้นไม้ ตอนนี้ เราจะเห็นแต่ละทรีย่อยทางซ้ายและทรีย่อยทางขวา ถ้าผลรวมของใบไม้เป็น K ให้พิมพ์ โหนดปัจจุบัน มิฉะนั้นจะเรียกซ้ำ, การนับใบของต้นไม้ย่อย
วิธีแก้ปัญหานี้อิงตามการสำรวจ ดังนั้นความซับซ้อนจะอยู่ที่ลำดับของขนาดของต้นไม้ ความซับซ้อนของเวลา − O(n)
ตัวอย่าง
โปรแกรมที่จะใช้แนวทางข้างต้น
#include<bits/stdc++.h> using namespace std; struct Node{ char data ; struct Node * left, * right ; }; struct Node * insertNode(char data){ struct Node * node = new Node; node->data = data; node->left = node->right = NULL; return (node); } int nodeWithKLeave(struct Node *ptr,int k){ if (ptr == NULL) return 0; if (ptr->left == NULL && ptr->right == NULL) return 1; int total = nodeWithKLeave(ptr->left, k) + nodeWithKLeave(ptr->right, k); if (k == total) cout<<ptr->data<<" "; return total; } int main() { struct Node *root = insertNode('A'); root->left = insertNode('B'); root->right = insertNode('K'); root->left->left = insertNode('N'); root->left->right = insertNode('S'); root->left->left->left = insertNode('X'); root->left->left->right = insertNode('H'); root->right->right = insertNode('E'); root->right->left = insertNode('T'); root->right->left->left = insertNode('O'); root->right->left->right = insertNode('P'); int K = 2; cout<<"Nodes with "<<K<<" leaves is :\n"; nodeWithKLeave(root, K); return 0; }
ผลลัพธ์
Nodes with 2 leaves are: N T