정점으로 트리의 노드를 포함하는 무방향 그래프가 주어집니다. 목표는 BFS(Breadth First Search) 알고리즘을 사용하여 트리의 주어진 수준에서 노드 수를 찾는 것입니다.
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

- 정점 수로 데이터를 사용하고 인접 목록에 대한 포인터로 다음 데이터를 사용하여 그래프를 나타내는 클래스 노드를 만듭니다.
- 공개 메소드 insert(int val, int point)는 그래프에 가장자리를 추가합니다.
- point의 인접 목록에 val을 추가하고 val의 인접 목록을 가리킵니다.
- count_nodes(int a, int b) 함수는 소스 노드 a에서 시작하는 b 수준의 노드 수를 반환합니다.
- 초기 개수를 0으로 설정합니다.
- bool 배열 검사 =new bool[data]
- 배열 arr[data]는 그래프의 각 정점 레벨을 저장합니다.
- for 루프를 사용하여 그래프의 모든 정점을 방문하지 않은 것으로 설정하고 check[i] =false 및 arr[i] =0으로 설정합니다.
- BFS 순회를 위한 대기열 l1을 만듭니다.
- 방문한 시작 정점을 check[a] =true로 표시하고 l1.push_back(a)를 사용하여 l1에 추가하고 레벨을 0으로 설정합니다. arr[a] =0.
- 대기열 l1이 비어 있지 않은 동안
- 앞의 요소를 a =l1로 취하십시오. front() 및 l1.pop_front()를 사용하여 인쇄합니다.
- 방문하지 않은 인접 정점을 모두 방문으로 표시하고 대기열 l1에 추가합니다.
- 인접한 각 정점의 레벨을 a + 1의 레벨로 설정합니다.
- while 루프가 끝날 때 for 루프와 for each arr[i] ==b 증분 카운트를 사용하여 arr[]을 트래버스합니다.
- 결과적으로 반환 횟수가 끝나면
예시
#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