ในปัญหานี้ เราได้รับไบนารีทรีและจำนวนเต็ม N ภารกิจคือการค้นหาโหนดที่ n ในการข้ามผ่าน Postorder ของทรีไบนารี
ต้นไม้ไบนารีมีเงื่อนไขพิเศษที่แต่ละโหนดสามารถมีลูกได้สูงสุดสองคน
การข้ามผ่านเป็นกระบวนการในการเยี่ยมชมโหนดทั้งหมดของต้นไม้และอาจพิมพ์ค่าของพวกมันด้วย
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
N = 6

ผลลัพธ์
3
คำอธิบาย
การข้ามผ่านของต้นไม้ − 4, 5, 2, 6, 7, 3, 1
แนวทางการแก้ปัญหา
แนวคิดคือการใช้การข้ามผ่านคำสั่งหลังของต้นไม้ไบนารีซึ่งทำได้โดยใช้การเรียกซ้ำ ในการโทรแต่ละครั้ง เราจะพบการเรียก postOrder() สำหรับทรีย่อยทางซ้ายก่อน จากนั้นจึงเรียก postOrder() และในตอนท้าย ให้ไปที่โหนดรูท ในระหว่างการข้ามผ่านนี้ เราจะนับจำนวนโหนดและพิมพ์โหนดที่นับเป็น N
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream>
using namespace std;
bool isAPrimeNumber(int n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n%2 == 0 || n%3 == 0) return false;
for (int i=5; i*i<=n; i=i+6)
if (n%i == 0 || n%(i+2) == 0)
return false;
return true;
}
long int calcPrimeProduct(long int n) {
long int p = 2;
n--;
for (int i = 3; n != 0; i++) {
if (isAPrimeNumber(i)) {
p = p * i;
n--;
}
i++;
}
return p;
}
long int findNextPrime(long int n) {
long int nextPrime = n + 2;
while (true) {
if (isAPrimeNumber(nextPrime))
break;
nextPrime++;
}
return nextPrime;
}
int main() {
long long int N = 5;
long long int primeProduct = calcPrimeProduct(N);
int fortunateNumber = findNextPrime(primeProduct) - primeProduct;
cout<<N<<"th fortunate number is "<<fortunateNumber;
return 0;
} ผลลัพธ์
5th fortunate number is 23