개발자 끄적끄적

이진트리(Binary Tree) 본문

알고리즘 분석

이진트리(Binary Tree)

햏치 2023. 3. 9. 12:30

<이진트리(Binary Tree)>
- 이진트리는 많은 응용프로그램에서 사용되며 트리의 대표적인 구조로서 트리의 기본을 이룬다

- 이진트리의 특성
  - 모든 노드의 자식 노드의 개수가 2개 이하

- 엄격한 이진트리(Strictly binary tree) 
  - 말단 노드를 제외한 모든 노드의 차수가 2인 트리

- Knuth binary tree 
  - 노드의 차수가 0, 1, 2인 tree로 일반적인 binary tree

- 포화 이진트리(Full binary tree)
  - 깊이가 k인 이진트리에서 노드의 수가 (2^k)-1(k>0)로서 모든 말단 노드는 k번째 레벨이 존재

- 완전 이진트리(Complete binary tree)
  - 깊이가 k인 이진 트리에서 k-1 레벨까지는 포화 이진트리(Full binary tree)이고, 각 노드들이 깊이 k인 포화 이진트리의 
    노드 번호들과 일대일로 일치하는 경우 그 역도 성립한다

- 포화 이진트리의 노드 개수 
  - 2^0 + 2^1 + 2^2 + ... + 2^(k-1)

- 깊이가 k인 포화이진 트리의 노드 수
  - (2^k)-1
  따라서, 임의의 레벨 i(i>=1)의 최대 노드 수는 (2^i)-1

- 트리를 구성하는 노드의 수(n)를 알고 이진 트리의 깊이를 구할 때
  - 포화이진 트리의 깊이 k는 
    n = (2^k) -1
    n + 1 = 2^k
    log2 (n+1) = k

  - 완전 이진트리의 경우
    - k = [log2 (n+1)] -> 자리수 올림
      즉, log2 (n+1)은 노드 수가 n인 포화이진 트리의 깊이가 된다. 만일 그 값보다 하나라도 많아지면
      소수점 이하 값이 발생하고 자리 수 올림에 의해 깊이가 1증가하게 된다

- 포화이진 트리의 부모 자식 노드 사이의 관계는 아래와 같다
  - 전체 노드 수가 n일 때,
    i번 노드의 부모 노드는
    [i/2] ->자리수 내림,    1<=[i/2]<=n 범위를 만족
    범위 밖의 경우 부모 노드가 존재하지 않는다
  - i번 노드의 왼쪽 자식은 2i번 노드이고 1<=2i<=n의 범위이며, 이 범위 밖의 경우 왼쪽 자식 노드가 없다
  - i번 노드의 오른쪽 자식은 (2i+1)번 노드이고 1<=(2i+1)<=n 의 범위이며, 이 범위 밖의 경우 오른쪽 자식은 없다

- 이진 트리의 표현
  - 이진 트리의 구현은 배열을 이용한 방법과 포인터를 이용한 연결리스트 방법이 있다

- 배열에 의한 표현
  - 완전 이진트리의 레벨 오더에 의한 순서를 첨자로 1차원의 배열에 순차적으로 입력 시켜 표현을 한다
    즉, 완전 이진트리로서 공간을 확보한다
   *레벨 오더(Level Order) : 노드에 번호를 지정한다 -> '배열'로 구현하기 위해서 첨자는 '0' 부터 시작한다
    레벨은 위에서 아래로, 왼쪽에서 오른쪽으로 증가
    데이터의 크기와 상관없이 예시를 들기위해서 번호(첨자)를 지정한다

- C언어의 배열 첨자 규칙(첨자가 0부터 시작)에 따르기 위해 위에서 주어진 부모/자식 노드 사이의 관계를 약간 수정한다
  - i번 노드의 부모 노드는 [(i-1)/2] -> 자리수 내림 이고,
    0<=[(i-1)/2]<=n-1 범위를 만족한다
  - i번 노드의 왼쪽 자식은 2i+1번 노드이고 0<=(2i+1)<=n-1의 범위이며, 이 범위 밖의 경우 왼쪽 자식 노드가 없다
  - i번 노드의 오른쪽 자식은 2(i+1)번 노드이고 0<=2(i+1)<=n-1의 범위이며, 이 범위 밖의 경우 오른쪽 자식은 없다



<배열의 특징>
- x[i] -> 데이터 공간을 확보
- scanf "%d", &[i] -> 외부에서 받아드리는 정보를 저장할 수 있다
- 배열의 각각의 공간에 찾아들어가기 위해서 쓰이는 것 :  배열의 첨차를 사용, 임의의 정보에 저장 또는 위치시킬 수 있다
- 데이터가 저장될 공간(0~(n-1))은 연속된 공간에 저장되어 있으며
  동일한 데이터 타입(Type)이어야 하며, 배열의 크기가 미리 고정되어 있어야한다(유연성이 떨어짐)
- int x[100] 일 때, 메모리를 10개만 쓰인다면 상당히 비효율적인 구조이다
  또는 int x[10]일 때, 메모리를 100개를 쓴다면 데이터를 저장하기에 공간이 부족하다
- 부모와 자식의 위치를 배열의 첨자를 계산하므로써 데이터를 넣을 수 있다
  *트리(Tree)는 동적인 구조이다. 즉, 크기나 구조가 가변적으로 변화할 수 있다는 의미이다

'알고리즘 분석' 카테고리의 다른 글

구조체의 개념, 포인터, 이중포인터  (0) 2023.03.17
트리의 순회  (0) 2023.03.09
트리(Tree) 개념  (0) 2023.03.04