이진트리의 일종으로 노드의 오른쪽 하위 트리에는 노드보다 큰값, 외쪽에는 작은 값이 위치
16
/ \
8 24
/ \ / \
4 12 20 28
/ \ / \ / \ / \
2 6 10 14 18 22 26 30
/ \ / \ / \ / \ / \ / \ / \ / \
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29
노드 1, 2, 3, 4가 있는 무방향 그래프에서 간선이 다음과 같다고 가정
인접 행렬 표현:
1 2 3 4
1 0 1 1 0
2 1 0 0 1
3 1 0 0 0
4 0 1 0 0
이걸 코드로 표현하면
bool a[4][4] = {
{0, 1, 1, 0},
{1, 0, 0, 1},
{1, 0, 0, 0},
{0, 1, 0, 0},
};
bool a[V][V];
for (int i =0; i<V; i++)
{
for (int j=0; j<V; j++)
{
if (a[i][j])
{
// 출력 로직
cout << i <<"부터 "<<j<<"까지 경로가 있음.\n";
//해당 정점으로부터 탐색
BFS(i);
DFS(i);
}
}
}
코드 예시
#include<bits/stdc++.h>
using namespace std;
const int V = 10; // 그래프에서 최대 정점 수 (10개의 정점)
bool a[V][V], visited[V]; // a: 간선 정보를 저장하는 인접 행렬, visited: 방문 여부 저장 배열
// 깊이 우선 탐색(DFS) 함수
void go(int from) {
visited[from] = 1; // 현재 노드를 방문 처리
cout << from << '\n'; // 방문한 노드 출력
// 현재 노드와 연결된 다른 노드 탐색
for (int i = 0; i < V; i++) {
if (visited[i]) continue; // 이미 방문한 노드는 건너뜀
if (a[from][i]) { // 간선이 존재하는 경우
go(i); // 연결된 노드로 이동하여 재귀적으로 탐색
}
}
return;
}
int main() {
// 인접 행렬에 간선 정보 입력 (무방향 그래프)
a[1][2] = 1; a[1][3] = 1; a[3][4] = 1; // 간선 추가: 1-2, 1-3, 3-4
a[2][1] = 1; a[3][1] = 1; a[4][3] = 1; // 무방향 간선 설정
// 그래프 탐색 시작
for (int i = 0; i < V; i++) { // 모든 정점 확인
for (int j = 0; j < V; j++) { // 해당 정점에 연결된 간선 확인
if (a[i][j] && visited[i] == 0) { // 간선이 존재하고 방문하지 않은 정점이면
go(i); // DFS 탐색 시작
}
}
}
return 0;
}
1번노드->2번노드->(다시 1번 노드 돌아와서) ->3번노드-> 4번노드
인접 리스트 표현:
#include<iostream>
#include<vector>
using namespace std;
const int V = 10; // 그래프에서 최대 정점 수 (10개의 정점)
vector<int> adj[V]; // 인접 리스트로 간선 정보를 저장
bool visited[V]; // 방문 여부 저장 배열
// 깊이 우선 탐색(DFS) 함수
void go(int from) {
visited[from] = 1; // 현재 노드를 방문 처리
cout << from << '\n'; // 방문한 노드 출력
// 현재 노드와 연결된 다른 노드 탐색
for (int to : adj[from]) {
if (!visited[to]) { // 아직 방문하지 않은 노드라면
go(to); // 연결된 노드로 이동하여 재귀적으로 탐색
}
}
return;
}
int main() {
// 인접 리스트에 간선 정보 입력 (무방향 그래프)
adj[1].push_back(2); adj[2].push_back(1); // 간선 1-2
adj[1].push_back(3); adj[3].push_back(1); // 간선 1-3
adj[3].push_back(4); adj[4].push_back(3); // 간선 3-4
// 그래프 탐색 시작
for (int i = 0; i < V; i++) {
if (!visited[i] && !adj[i].empty()) { // 방문하지 않았고 연결된 간선이 있는 정점이라면
go(i); // DFS 탐색 시작
}
}
return 0;
}
비교 항목 인접 행렬 (Adjacency Matrix) 인접 리스트 (Adjacency List)
메모리 사용 | O(V²) | O(V + E) |
연결 여부 확인 | O(1) | O(인접 리스트 길이) |
인접 노드 탐색 | O(V) | O(인접한 노드 수) |
간선 추가/삭제 | O(1) | O(1) |
희소 그래프 | 비효율적 | 효율적 |
밀집 그래프 | 효율적 | 비효율적 |
벨만-포드 알고리즘 (Bellman-Ford Algorithm) (0) | 2025.01.13 |
---|---|
재귀함수 Recursion (1) | 2025.01.06 |
이진 트리 (Binary Tree) (0) | 2024.12.16 |
DFS depth first search & BFS breath first search // Tree트리 01 (0) | 2024.12.16 |
vector 벡터02 반복자(iterator) (2) | 2024.12.14 |