กำหนดกราฟแบบไม่มีทิศทางที่มีโหนดของต้นไม้เป็นยอด เป้าหมายคือการค้นหาจำนวนโหนดที่ระดับที่กำหนดของทรีโดยใช้อัลกอริธึม BFS (การค้นหาแรกแบบกว้าง)
อัลกอริทึม BFS:-
อัลกอริธึมนี้เริ่มสำรวจกราฟ/ระดับต้นไม้ตามระดับ เริ่มจากโหนดที่ระดับ 0 ขั้นแรก จะข้ามโหนดทั้งหมดที่เชื่อมต่อโดยตรงกับมันที่ระดับ 1 จากนั้นจะข้ามโหนดทั้งหมดที่ระดับถัดไปเป็นต้น
- ข้ามโหนดในแนวนอนที่ระดับปัจจุบัน
- ข้ามโหนดที่ระดับถัดไปในลักษณะที่คล้ายกัน
ให้เราเข้าใจด้วยตัวอย่าง
ตัวอย่าง
ป้อนข้อมูล - ระดับ=2

ผลลัพธ์ - จำนวนโหนดที่ระดับที่กำหนดในทรีโดยใช้ BFS คือ:1
คำอธิบาย - ดังที่แสดงไว้ข้างต้น ทุกระดับมีโหนดเดียวในกราฟ
ป้อนข้อมูล - ระดับ=1

ผลลัพธ์ - จำนวนโหนดที่ระดับที่กำหนดในทรีโดยใช้ BFS คือ:2
คำอธิบาย - ดังที่แสดงไว้ข้างต้น ทุกระดับมีโหนดเดียวในกราฟ โหนดคือ 1, 2
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
ในแนวทางนี้ เราจะสำรวจแต่ละโหนดและตั้งค่าระดับเป็นระดับที่มากกว่าระดับบนสุดหนึ่งระดับ เราจะแสดงกราฟโดยใช้การแสดงรายการที่อยู่ติดกัน
หากโหนดเริ่มต้นเป็น 0 ดังนั้น
ระดับ[0]=0,
ระดับ[1] =ระดับ[0]+1 =1, ระดับ[2]=ระดับ[0]+1=1
ระดับ[3]=ระดับ[2]+1 =2, ระดับ[4]=ระดับ[2]+1=2

- สร้างโหนดคลาสที่แสดงกราฟที่มีข้อมูลเป็นจำนวนจุดยอดและถัดไปเป็นตัวชี้ไปยังรายการที่อยู่ติดกัน
- การแทรกวิธีสาธารณะ (int val, int point) เพิ่มขอบให้กับกราฟ
- เพิ่มรายการที่อยู่ติดกันของ val to point และชี้ไปที่รายการที่อยู่ติดกันของ val
- Function count_nodes(int a, int b) คืนค่าจำนวนโหนดที่ระดับ b โดยเริ่มจากโหนดต้นทาง a.
- ตั้งค่าการนับเริ่มต้นเป็น 0
- ตรวจสอบบูลอาเรย์ =บูลใหม่[ข้อมูล].
- Array arr[data] เก็บระดับของแต่ละจุดยอดของกราฟ
- ตั้งค่าจุดยอดทั้งหมดของกราฟเป็นไม่มีการไปเยี่ยมชมโดยใช้ for loop และตั้งค่า check[i] =false และ arr[i] =0
- สร้างคิว l1 สำหรับการข้ามผ่าน BFS
- ทำเครื่องหมายว่าจุดยอดที่เข้าชมเป็น check[a] =true และเพิ่มไปที่ l1 โดยใช้ l1.push_back(a) และตั้งค่าระดับเป็น 0 arr[a] =0
- ในขณะที่คิว l1 ไม่ว่าง
- ใช้องค์ประกอบด้านหน้าเป็น a =l1 front() และพิมพ์โดยใช้ l1.pop_front().
- ทำเครื่องหมายจุดยอดที่ยังไม่ได้เยี่ยมชมที่อยู่ติดกันทั้งหมดของ a ว่าได้เข้าชมแล้ว และเพิ่มไปยังคิว l1
- กำหนดระดับของแต่ละจุดยอดที่อยู่ติดกันเป็นระดับ + 1
- ที่ส่วนท้ายของ while loop traverse arr[] โดยใช้ for loop และสำหรับแต่ละ arr[i] ==b นับการเพิ่มขึ้น
- เมื่อสิ้นสุดการส่งคืน นับเป็นผลลัพธ์
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class node {
int data;
list < int > * next;
public:
node(int data) {
this -> data = data;
next = new list < int > [data];
}
void insert(int val, int point) {
next[val].push_back(point);
next[point].push_back(val);
}
int count_nodes(int a, int b);
};
int node::count_nodes(int a, int b) {
int count = 0;
bool * check = new bool[data];
int arr[data];
for (int i = 0; i < data; i++) {
check[i] = false;
arr[i] = 0;
}
list < int > l1;
check[a] = true;
l1.push_back(a);
arr[a] = 0;
while (!l1.empty()) {
a = l1.front();
l1.pop_front();
for (auto it = next[a].begin(); it != next[a].end(); ++it) {
if (!check[ * it]) {
arr[ * it] = arr[a] + 1;
check[ * it] = true;
l1.push_back( * it);
}
}
}
for (int i = 0; i < data; i++) {
if (arr[i] == b) {
count++;
}
}
return count;
}
int main() {
node n1(5);
n1.insert(1, 2);
n1.insert(0, 3);
n1.insert(1, 3);
n1.insert(2, 4);
int level = 1;
cout << "Count of number of nodes at given level in a tree using BFS are: " << n1.count_nodes(0, level);
return 0;
} หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
ผลลัพธ์
Count of number of nodes at given level in a tree using BFS are: 1