트리와 순회(preOrder, postOrder)

msung99·2022년 4월 6일
0
post-thumbnail

지난 내용

조상 노드, 깊이(depth), 자식 노드를 고려시 자기자신은 포함x!!!

  • 트리는 계층 구조를 이룸
  • 트리의 높이(height) = 노드들중에서 깊이의 최댓값
  • 노드끼리 parent-child 관계로 연결되어있다.
    즉, 어떤 노드를 보더라도 parent와 child가 있다.
    (시작과 끝은 각각 parent와 child가 null 일 뿐)
    cf. parent, child를 알 필요 없는 트리의 경우 둘 중 하나를 안주기도 한다.

Tree ADT

  • 트리는 노드의 포지션으로 데이터에 접근함
  • 노드로 구현하는 것이 일반적
  • 노드 구조체 내부
    • parent의 위치들과 child 위치들을 잘 알수있도록 노드 구조체 내부가 잘 구현되어 있어야함
    • 구성요소 : 노드형 포인터 parent, 노드형 포인터 child들의 리스트
      => 트리에서는 child가 몇개일지 모르므로, 리스트에 child 노드형 포인터들을 저장

메소드

  • position root()
  • list< position > positions()
  • position parent()
  • list< position > childern()
  • boolean isRoot()
  • boolean isExternal()
  • integer size()
  • bool empty()

메소드 상세설명

  1. 바깥에서 access 할수있는 point를 제공해주는 메소드들
  • position root() : 루트 노드의 position을 리턴
  • list< position > positions() : 전체 노드의 position을 list 형식으로 리턴
    • 노드들의 position 리스트. 링크드 리스트 형태로 유지
  1. position 기반 메소드들
  • position parent() : 주어진 position에 대한 해당노드의 부모노드 position을 리턴
  • list< position > childern() : 주어진 position에 대한 해당노드의 자식들의 position 리스트를 리턴

3.판단 메소드들

  • boolean isRoot() : 루트 노드인지 판별
  • boolean isExternal() : 외부 노드인지 판별

4.기타 메소드

  • integer size()
  • bool empty()

Preorder Traversal (전위순회)

  • traversal : 트리의 모든 노드들을 한번씩 방문(=작업을)하는 알고리즘

  • 가장 먼저 자기자신을 작업한후, child를 문제에서 지정해준 방문순서에 따라 처리한다

  • 시간복잡도 : O(1) => 각 노드에 대한 작업(visit)은 딱 한번만 한다.

  • 각 자식들에 대해서 작업을 실행하려고 봤더니 작업할 자식이 더 없다면 return 해서 되돌아간다

Algorithm preOrder(v)        // v가 루트노드인 트리에 대해서 전위순회를 한다
  visit(v)                   // 자기 자신을 먼저 처리하고
  for each child w of v      // v의 각각의 child에 대해서 다 각각 전위순회를 실행
    preOrder(w)              // 재귀호출
  • child의 방문순서는 딱히 없지만, 시험문제 출제시 편의상 자식방문 순서를 지정해준다.
    • 실제 코드상에서는 그 노드들이 어떤 순서대로 저장되있거나, 아무렇게나 지정되있는 자식들을 비교해서 sorting 해야하므로 시간복잡도가 달라진다.
    • 아무렇게 방문하거나 특정 순서를 주고 그대로 순회를 한다면 O(1)이다.
    • ex) 정수의 작은수부터 큰 순서대로 방문한다는 조건 / 알파벳 순서로 방문

Postorder Traversal

  • 자식들을 다 처리후에 자신을 처리
  • O(1) : 마찬가지로 각 노드들은 한번씩 처리된다.
  • 활용분야 : 폴더의 하위폴더들의 용량을 다 더해서 총 용량을 구하는 것
Algorithm postOrder(v)
  for each child w of v
    postOrder(w)
  visit(v)

Binary Trees (이진트리)

  • 정의 : 모든 internal 노드의 자식 노드가 2개 이하인 트리

  • 재귀적 정의1 : 노드 하나만 있으면(single node) 이진트리

  • 재귀적 정의2 : 트리인데 두 child 가 ordered pair(순서쌍)이고 각각이 다시 이진트리인 트리

  • 활용분야 : 이항 연산자와 같은 수식표현(arithmetic expression), decision processes, 탐색(BST)

  • proper binary tree

    • 모든 노드가 2개 또는 0개의 자식을 갖는 트리
    • 구현시 dummy 노드를 추가해서 external node가 더이상 없음을 알려줄 수도 있다 (선택사항)
      => 데이터가 없는 노드를 트리 끝에 넣음으로써 트리의 끝임을 알려주기 위함
  • 어떤 노드의 자식은 순서쌍(ordered pair)으로 이루어진다.
    => 왼쪽 자식(left child), 오른쪽 자식(right child)

  • 트리는 순서를 지정하지 않을 수 있지만, 이진 트리는 왼쪽자식 먼저 순서가 정해져있다.

profile
https://haon.blog

0개의 댓글