이 영역을 누르면 첫 페이지로 이동
컴퓨터와 수학, 몽상 조금 블로그의 첫 페이지로 이동

컴퓨터와 수학, 몽상 조금

페이지 맨 위로 올라가기

컴퓨터와 수학, 몽상 조금

컴퓨터공학, 딥러닝, 수학 등을 다룹니다.

9. 트리 ADT (Tree)

  • 2020.06.05 11:08
  • 학부 수업/자료구조
반응형

트리 ADT

트리는 계층적으로 저장된 데이터 원소들을 모델링한다.

최상위 원소를 제외하고, 각 원소는 부모 원소와 0개 이상의 자식 원소를 가진다.

트리 용어

  • 루트(root): 뿌리 노드, 부모가 없는 최상위 노드
  • 내부 노드(internal node), leaf: 자식이 없는 노드
  • 형제(siblings): 같은 부모를 가진 노드들
  • 조상 노드: 부모, 조부모 노드 등
  • 자손 노드: 자식, 손주 노드 등
  • 부트리(Subtree): 노드와 그 노드의 자손들로 구성된 트리
  • 경로: 조상 또는 자손을 따라 이어진 노드 시퀀스 (예: ABD)
  • 경로 길이: 경로내 간선의 수
  • 노드의 깊이: 루트로부터 노드에 이르는 유일한 경로의 길이
  • 노드의 높이: 노드로부터 리프에 이르는 가장 긴 경로의 길이
  • 트리의 높이: 루트의 높이

순서트리ordered tree

순서트리는 각 노드의 자식들에 대해 선형 순서가 정의되어 있는 트리를 말한다.
(목차가 있는 책 등)

트리 ADT 함수

node root();
node parent(v);
node children(v);
elem element(v);

bool isInternal(v);
bool isExternal(v);
bool isRoot(v);

swap Elements(v, w);
elem setElem(v, e);

트리의 응용

  • 조직구성도
    • 내부노드: 부, 과, 팀 등
    • 외부노드: 직원
  • 파일 시스템
    • 내부노드: 폴더
    • 외부노드: 파일
  • 프로그래밍 환경
    • 내부노드: 프로그램 구조물
    • 외부노드: 어휘, 상수, 심볼 등

트리 함수의 구현

def height(v):
    if isExternal(v):
        return 0
    else:
        h=0
        for child in children(v):
            h = max(h, height(child))
        return 1+h
  • 선위순회 (Preorder traversal)
    • 선위순회에서는, 노드가 그의 자손들보다 앞서 방문된다. (root -> leaf)
    • 실행시간은 O(n)
      def preOrder(v):
      visit(v)
      for w in children(v):
        preOrder(w)
  • 후위순회 (Postorder traversal)
    • 노드가 그의 자손들보다 나중에 방문된다. (leaf -> root)
    • 실행시간은 선위와 같은 O(n)
      def postOrder(v):
      for w in children(v):
        postOrder(w)
      visit(v)
  • 레벨 순회
    • 레벨 순회는 트리의 특정 깊이 d에 존재하는 모든 노드들을 순회한다.
    • 큐를 이용하여, 깊이 d의 모든 노드들이 깊이 d+1의 노드들에 앞서 방문된다.
    • 실행시간은 O(n)이다.
      def levelOrder(v):
      q = queue()
      q.enqueue(v)
      while !q.isEmpty():
        v = q.dequeue()
        visit(v)
        for w in children(v):
            q.enqueue(w)
      return
  • 중위 순회 (Inorder traversal)
    • 노드가 왼쪽 자손 이후, 오른쪽 자손 이전에 방문된다.
    • 수식의 인쇄, 이진트리 작성등에 쓰인다.
    • 실행시간은 역시 O(n)이다.
      def inOrder(v):
      	if isInternal(v):
          	inOrder(left(v))
          visit(v)
          if isInternal(v):
          	inOrder(right(v))

이진 트리 ADT

이진트리 ADT는 각 원소가 0개 혹은 2개의 자식 노드를 갖는 순서트리를 모델링 한다. 각 자식은, 왼쪽 및 오른쪽 자식이라 부른다.

배열 기반 이진 트리

1D 배열로 이진트리를 표현할 수 있다.

  • 랭크 i의 노드에 대해
    • 왼쪽 자식의 위치는 2i
    • 오른쪽 자식의 위치는 2i+1
    • 부모의 위치는 i/2

노드 간의 링크를 저장할 필요가 없다.
순위 0 셀은 사용하지 않고, 미사용 셀에는 특별한 값을 저장한다. (널값 혹은 널마커 #)

최선의 경우(완전 이진 트리) 메모리 사용량과 크기가 일치하지만, 최악의 경우에는 N = 2**n -1 이 될 수도 있다.

연결 이진 트리

각 노드에 아래 내용을 저장한다.

  • 원소
  • 부모노드
  • 왼쪽 자식노드
  • 오른쪽 자식노드

오일러 투어 순회

트리의 바깥쪽을 따라 트리를 순회, 각 노드를 세 번씩 방문한다.

def eulerTour(v):
	visitLeft(v)	#전위 순회
    if isInternal(v):
    	eulerTour(left(v))
    visitBelow(v)	#중위 순회
    if isInternal(v):
        eulerTour(right(v))
    visitRight(v)	#후위 순회

 

반응형

'학부 수업 > 자료구조' 카테고리의 다른 글

10. 트리의 응용과 구현  (0) 2020.06.24
8. 큐, 디큐 ADT (Queue, Dequeue)  (0) 2020.05.29
7. 스택 ADT  (0) 2020.05.14
6. 집합 ADT  (0) 2020.05.09
5. 리스트의 그룹과 공유  (0) 2020.04.23

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 10. 트리의 응용과 구현

    10. 트리의 응용과 구현

    2020.06.24
  • 8. 큐, 디큐 ADT (Queue, Dequeue)

    8. 큐, 디큐 ADT (Queue, Dequeue)

    2020.05.29
  • 7. 스택 ADT

    7. 스택 ADT

    2020.05.14
  • 6. 집합 ADT

    6. 집합 ADT

    2020.05.09
다른 글 더 둘러보기

정보

컴퓨터와 수학, 몽상 조금 블로그의 첫 페이지로 이동

컴퓨터와 수학, 몽상 조금

  • 컴퓨터와 수학, 몽상 조금의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (281) N
    • Tech Trend (3)
    • Deep Learning (77)
      • 공부 노트 (21)
      • 논문 리뷰 (44)
      • 논문 스키밍 (1)
      • 영상처리 (11)
    • Engineering (3)
      • Tips (2)
      • Experiences (1)
    • Blog (47) N
      • 회고 & 계획 (19) N
      • 내 이야기 (9)
      • 리뷰 (3)
      • 군대에 간 공돌이 (10)
      • ML엔지니어 취업 도전기 (1)
      • 여행 (4)
    • 학부 수업 (141)
      • 머신러닝 (16)
      • C프로그래밍 (8)
      • 자료구조 (11)
      • 알고리즘 (17)
      • 디지털시스템 (25)
      • 컴퓨터구조 (11)
      • 확률과 통계 (21)
      • 선형대수학 (14)
      • 이산수학 (18)
      • 데이터시각화 (0)
    • 강의 (9)
      • 딥러닝 기초 (7)
      • Python (2)

공지사항

인기 글

정보

백지오의 컴퓨터와 수학, 몽상 조금

컴퓨터와 수학, 몽상 조금

백지오

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
반응형

나의 외부 링크

  • profile
  • github
  • linkedin

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. © 백지오. Designed by Fraccino.

티스토리툴바