กำหนดไบนารีทรีที่มีน้ำหนักของโหนด เป้าหมายคือการหาจำนวนโหนดที่มีน้ำหนักเพื่อให้เป็นจำนวนเต็มกำลังสอง หากน้ำหนักเท่ากับ 36 ก็จะเป็น 62 ดังนั้นโหนดนี้จะถูกนับ
ตัวอย่าง
อินพุต
ต้นไม้ที่จะถูกสร้างขึ้นหลังจากป้อนค่าจะได้รับด้านล่าง -

ผลลัพธ์
Count the nodes whose weight is a perfect square are: 4
คำอธิบาย
เราได้รับกับโหนดต้นไม้และน้ำหนักที่เกี่ยวข้องกับแต่ละโหนด ตอนนี้เราตรวจสอบว่าตัวเลขของโหนดเป็นกำลังสองสมบูรณ์หรือไม่
| โหนด | น้ำหนัก | สี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ | ใช่/ไม่ใช่ |
|---|---|---|---|
| 2 | 121 | 11*11 | ใช่ |
| 1 | 81 | 9*9 | ใช่ |
| 4 | 37 | เลขเด่น | ไม่ |
| 3 | 25 | 5*5 | ใช่ |
| 8 | 100 | 10*10 | ใช่ |
| 9 | 701 | เป็นไปไม่ได้ | ไม่ |
อินพุต
ต้นไม้ที่จะถูกสร้างขึ้นหลังจากป้อนค่าจะได้รับด้านล่าง -

ผลลัพธ์
Count the nodes whose weight is a perfect square are: 2
คำอธิบาย
we are given with the tree nodes and the weights associated with each node. Now we check whether the digits of nodes are perfect squares or not.
| โหนด | น้ำหนัก | สี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ | ใช่ / ไม่ใช่ |
|---|---|---|---|
| 2 | 11 | เป็นไปไม่ได้ | ไม่ |
| 1 | 16 | 4*4 | ใช่ |
| 4 | 4 | 2*2 | ใช่ |
| 3 | 26 | เป็นไปไม่ได้ | ไม่ |
| 8 | 1001 | เป็นไปไม่ได้ | ไม่ |
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้ −
ในแนวทางนี้ เราจะใช้ DFS กับกราฟของต้นไม้เพื่อข้ามผ่าน และตรวจสอบว่าน้ำหนักของโหนดเป็นกำลังสองสมบูรณ์หรือไม่ ใช้เวกเตอร์ Node_Weight(100) และ edge_graph[100] สองตัวเพื่อการนี้
-
เริ่มต้น Node_Weight[] ด้วยน้ำหนักของโหนด
-
สร้างต้นไม้โดยใช้ vector edge_graph
-
ใช้สี่เหลี่ยมตัวแปรส่วนกลางและเริ่มต้นด้วย 0
-
การตรวจสอบฟังก์ชัน (int check_it) ใช้จำนวนเต็มและคืนค่า จริง หาก check_it เป็นกำลังสองสมบูรณ์
-
เอาผลรวม =sqrt(check_it)
-
ตอนนี้ if(floor(total) !=ceil(total)) คืนค่า true ผลรวมไม่ใช่กำลังสองสมบูรณ์ ให้คืนค่าเท็จ
-
คืนค่า true มิฉะนั้น
-
ฟังก์ชัน perfect_square(int node, int root) รับโหนดและโหนดรูทของต้นไม้และคืนค่าจำนวนโหนดในทรีที่กำหนดซึ่งมีน้ำหนักเป็นกำลังสองสมบูรณ์
-
ถ้า if(check(Node_Weight[node])) คืนค่า true ให้เพิ่มกำลังสอง
-
ต้นไม้ขวางใน vector edge_graph[node] ใช้สำหรับวนซ้ำ
-
เรียก perfect_square(it, node) สำหรับโหนดถัดไปในเวกเตอร์
-
ที่ส่วนท้ายของฟังก์ชันทั้งหมด เราจะมีสี่เหลี่ยมจัตุรัสเท่ากับจำนวนโหนดที่มีน้ำหนักมีค่าเป็นกำลังสองสมบูรณ์
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
vector<int> Node_Weight(100);
vector<int> edge_graph[100];
int square = 0;
bool check(int check_it){
double total = sqrt(check_it);
if(floor(total) != ceil(total)){
return false;
}
return true;
}
void perfect_square(int node, int root){
if(check(Node_Weight[node])){
square++;
}
for (int it : edge_graph[node]){
if(it == root){
continue;
}
perfect_square(it, node);
}
}
int main(){
//weight of the nodes
Node_Weight[2] = 121;
Node_Weight[1] = 81;
Node_Weight[4] = 37;
Node_Weight[3] = 25;
Node_Weight[8] = 100;
Node_Weight[9] = 701;
//create graph edge
edge_graph[2].push_back(1);
edge_graph[2].push_back(4);
edge_graph[4].push_back(3);
edge_graph[4].push_back(8);
edge_graph[8].push_back(9);
perfect_square(2, 2);
cout<<"Count the nodes whose weight is a perfect square are: "<<square;
return 0;
} ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count the nodes whose weight is a perfect square are: 4