[07.10] Tree와 Graph

0
post-thumbnail

목차

  • Tree
  • Graph
  • BFS, DFS

📌 Tree

트리는 계층적 트리구조

  • 하나이상의 데이터에 한개의 경로와 하나의 방향으로만 연결된 계층적 자료구조
  • 데이터를 순차적으로 나열시킨 선형구조가 아닌 하나의 데이터 아래에 여러개의 데이터가 존재할 수있는 비선형구조
  • 계층적으로 표현이 되고 아래로만 뻗어나가기 때문에 사이클(순환, 부메랑처럼 돌아오는거)이 없음

트리구조와 특징

  • 루트라는 하나의 꼭짓점 데이터를 시작으로 여러 개의 데이터를 간선으로 연결
  • 용어
    • 노드(Node) : 트리 구조를 이루는 모든 개별 데이터
    • 루트(Root) : 트리 구조의 시작점이 되는 노드
    • 부모 노드(Parent node) : 두 노드가 상하관계로 연결되어 있을 때 상대적으로 루트에서 가까운 노드
    • 자식 노드(Child node) : 두 노드가 상하관계로 연결되어 있을 때 상대적으로 루트에서 먼 노드
    • 리프(Leaf) : 트리 구조의 끝 지점이고, 자식 노드가 없는 노드
  • 구조
    • A는 B와 C의 부모노드
    • B와 C는 A의 자식 노드
    • 자식이 없는 노드는 나무의 잎과 같다고 하여 리프토드라고 불림

트리 구조의 레벨과 서브 트리

  • 트리 구조에서는 최상단의 루트로부터 하위 계층의 특정노드까지의 깊이(depth)를 표현할 수 있음
    • 루트 A : 깊이 0
    • B와 C : 깊이 1
    • D,E,F,G : 깊이 2
  • 트리 구조에서 같은 깊이를 가지고 있는 노드를 묶어서 레벨(level)로 표현할 수 있음
    • Level 1 : 깊이가 0인 루트 A
    • Level 2 : 깊이가 1인 B와 C
    • Level 3 : D,E,F,G
    • 같은 레벨에 나란히 있는 노드를 형제 노드라고 함
  • 트리 구조에서 리프 노드를 기준으로 루트까지의 높이(height)를 표현할 수 있음
    • 리프 노드의 높이(H, I, E, F, J) : 0
    • D, G : 1
    • B , C : 2
    • A : 3
  • 서브 트리 : 트리 구조를 갖춘 작은 트리
  • 예시 : 컴퓨터의 디렉터리구조
    [하나의 폴더 안에 여러 개의 폴더가 있고, 또 그 여러 개의 폴더 안에 또 다른 폴더나 파일이 있습니다. 위 그림처럼, 제일 첫 번째 폴더에서 출발하여 도착하려는 폴더로 가는 경로는 유일합니다. 사용자들이 편하게 사용하기 위한 파일 시스템 등에서는 트리 구조를 이용해 만들어져 있습니다.]

이진트리 (Binary tree)

  • 자식 노드가 최대 두개인 노드로 구성된 트리
  • 이진 트리 특징 (자료의 삽입, 삭제에 따라 정해짐)
    • 정 이진트리(Full binary tree) : 각 노드가 0개 혹은 2개의 자식 노드를 갖음
    • 포화 이진트리(Perfect binary tree) : 정 이진트리이면서 완전 이진트리인 경우/ 모든 리프 노드의 레벨이 동일하고 모든 레벨이 가득 채워져있는트리
    • 완전 이진트리(Complete binary tree) : 마지막 레벨을 제외한 모든 노드가 가득 차 있어야하고, 마지막 레벨의 노드는 전부 차있지 않아도 되지만 왼쪽은 필수로 채워져야함

이진탐색 트리

  • 이진 탐색 알고리즘이란 정렬된 데이터 중에서 특정한 값을 찾기 위한 탐색 알고리즘
    오름차순으로 정렬된 정수의 배열을 같은 크기의 두 부분 배열로 나눈 후, 두 부분 중 탐색이 필요한 부분에서만 탐색하도록 탐색 범위를 제한하여 원하는 값을 찾는 알고리즘
  • 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징
  1. 배열의 중간에 내가 찾고자 하는 값이 있는지 확인한다.
  2. 중간값이 내가 찾고자 하는 값이 아닐 경우, 오름차순으로 정렬된 배열에서 중간값보다 큰 값인지 작은 값인지 판단한다.
  3. 찾고자 하는 값이 중간값보다 작은 값일 경우, 배열의 맨 앞부터 중간값 전까지의 범위를 탐색 범위로 잡고 탐색을 반복 수행한다.
  4. 찾고자 하는 값이 중간값보다 큰 값일 경우, 배열의 중간값의 다음 값부터 맨 마지막까지를 탐색 범위로 잡고 탐색을 반복 수행한다.

Tree의 순회 방법

전위 순회(Preorder traverse)

  • 가장 먼저 방문하는 노드 : 루트
  • 루트에서 시작해서 왼쪽의 노드들을 순차적으로 둘러본뒤, 왼쪽의 노드 탐색이 끝나면 오른쪽 노드를 탐색
  • 부모 노드가 제일 먼저 방문되는 순회 방식
  • 트리를 복사할때 사용

중위 순회(inorder traverse)

  • 루트를 가운데에 두고 순회
  • 제일 왼쪽 끝에 있는 노드부터 순회하기 시작
  • 루트를 기준으로 왼쪽에 있는 노드의 순회가 끝나면 루트를 거쳐 오른쪽에 이는 노드로 이동하여 마저 탐색
  • 부모 노드가 서브 트리의 방문 중간에 방문되는 순회 방식
  • 중위 순회는 이진 탐색트리의 오름 차순으로 값을 가져올때 쓰임

후위 순회(postorder traverse)

  • 루트를 가장 마지막에 순회
  • 제일 왼쪽 끝에 있는 노드부터 순회하기 시작하여, 루트를 거치지 않고 오른쪽으로 이동해 순회한 뒤 제일 마지막에 루트를 방문
  • 후위 순회는 트리를 삭제할때 사용
    -> 자식노드가 먼저 삭제되어야 상위 노드를 삭제할 수 있기 때문

레벨 순회(levelorder traverse)

  • 레벨 기준으로 노드들을 방문하는 방법
  • 동일한 레벨에 여러 노드가 존재할 경우 왼쪽에서 오른쪽 순서로 노드를 방문

📌 Graph

  • 직접적인 관계가 있는 경우 두 점사이를 이어주는 선이 있음
  • 간적적입 관계라면 몇 개의 점과 선에 걸쳐 이어짐
  • 하나의 점을 그래프에서는 정점(vertex)이라고 표현하고, 하나의 선은 간선(edge)이라고함

Graph의 표현 방식

  • 인접 행렬 : 두 정점을 이어주는 간선이 있다면 두 정점은 인접하다고 함
    • 인접 행렬은 서로 다른 정점들이 인접한 상태인지를 표시한 행렬로 2차원 배열의 형태로 나타냄
    • A라는 정점과 B라는 정점이 이어져 있다면 1(true), 이어져 있지 않다면 0(false)으로 표시한 일종의 표
  • 진출차수 : 상대 정점에서 자신의 정점으로 올 수 있는 간선이 있는지를 확인
    • A의 진출 차수는 1개 : A -> C

      [0][2] === 1 
      // A는 배열의 0번째이고 C[2]로 가는 진출 차수가 있다.(true=1)
    • B의 진출차수는 2개 : B —> A, B —> C

      [1][0] === 1 
      // B[1]은 A[0]으로 가는 진출 차수가 있다(true=1)
      
      [1][2] === 1 
      // B[1]는 C[2]로 가는 진출차수가 있다(true=1)
    • C의 진출차수는 1개 : C -> A

      [2][0] === 1 
      // C[2]는 A[0]로 가는 진출차수가 있다(true=1)
  • 인접리스트 : 각 정점이 어떤 정점과 인접하는 지를 리스트의 형태로 표현함
    • 예시

      1) 0번 노드는 1, 2, 3과 모두 이어져 있으므로 [0, *] -> [1, *] -> [2, *] -> [3, null]
      2) 1번 노드는 0과 2에 이어져 있으므로 [1, *] -> [0, *] -> [2, null]
      3) 2번 노드는 0과 1과 3에 이어져 있으므로 [2, *] -> [0, *] -> [1, *] -> [3, null]
      4) 3번 노드는 0과 2에 이어져 있으므로 [3, *] -> [0, *] -> [2, null]

Graph 용어들

  • 정점 (vertex): 노드(node)라고도 하며 데이터가 저장되는 그래프의 기본 원소입니다.
  • 간선 (edge): 정점 간의 관계를 나타냅니다. (정점을 이어주는 선)
  • 인접 정점 (adjacent vertex): 하나의 정점에서 간선에 의해 직접 연결된 정점을 뜻합니다.
  • 가중치 그래프 (weighted Graph): 연결의 강도(추가적인 정보, ex. 서울-부산으로 가는 거리 등)가 얼마나 되는지 적혀 있는 그래프를 뜻합니다.
  • 비 가중치 그래프 (unweighted Graph): 연결의 강도가 적혀 있지 않는 그래프를 뜻합니다.
  • 무향(무방향) 그래프 (undirected graph): 앞서 보았던 내비게이션 예제는 무향(무방향) 그래프입니다. 서울에서 부산으로 갈 수 있듯, 반대로 부산에서 서울로 가는 것도 가능합니다. 하지만 단방향(directed) 그래프로 구현된다면 서울에서 부산으로 갈 수 있지만, 부산에서 서울로 가는 것은 불가능합니다(혹은 그 반대). 만약 두 지점이 일방통행 도로로 이어져 있다면 단방향인 간선으로 표현할 수 있습니다.
  • 진입차수 (in-degree) / 진출차수 (out-degree): 한 정점에 진입(들어오는 간선)하고 진출(나가는 간선)하는 간선이 몇 개인지를 나타냅니다.
  • 인접 (adjacency): 두 정점 간에 간선이 직접 이어져 있다면 이 두 정점은 인접한 정점입니다.
  • 자기 루프 (self loop): 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다라고 표현합니다. 다른 정점을 거치지 않는다는 것이 특징입니다.
  • 사이클 (cycle,순환): 한 정점에서 출발하여 다시 해당 정점으로 돌아갈 수 있다면 사이클이 있다고 표현합니다. 내비게이션 그래프는 서울 —> 대전 —> 부산 —> 서울로 이동이 가능하므로, 사이클이 존재하는 그래프입니다.

📌 BFS, DFS

  • 너비 탐색을 우선시
  • 두 정점 사이의 최단 경로를 찾을때 사용

    Q : 왜 최단 경로를 찾을때 BFS 방식을 사용할까?
    A : 한 경로를 끝까지 모두 다 탐색하는 처음 발견한 답이 최단 거리가 아닐 수 있지만, BFS는 현재 있는 노드에서 가까운 곳부터 탐색하므로 경로를 탐색하는 도중 가장 먼저 발견한 해답이 최단거리라는 보장이 되기 때문입니다.

  • 예를 들어, 한국을 기준으로 미국까지 가는 방법을 가까운 정점부터 탐색
  • 깊이를 먼저 탐색하는 방법
  • 한 정점에서 시작해서 다음 경로로 넘어가기전에 해당 경로를 완벽하게 탐색할 때 사용
  • BFS보다 시간은 조금 오래 걸려도 모든 노드를 완전히 탐색할 수 있음

0개의 댓글