개발/Algorithm

트리와 이진트리(Tree and Binary Tree)

개발 여행 2020. 5. 27. 01:34
728x90

트리(Tree)란?

그래프의 일종으로 계층적인 구조를 표현하는 것.

 

 

트리(Tree) 예시

· 조직도 ( 회사 등에서 흔히 볼 수 있는 조직도 ) 

· 디렉토리와 서브디렉토리 구조 ( 컴퓨터에 저장된 폴더의 구조 )

· 가계도 

 

트리(Tree)노드(node)들과 노드들을 연결하는 링크(link)들로 구성돼있다.

 

루트(root)노드란?

트리에서 최상위 노드를 루트 노드(root node 뿌리 노드)라고 한다. 위의 그림에서는 dog가 루트 노드이다.

 

트리에서 부모-자식 관계

dog는 cat, fox, wolf의 부모 노드(parent node)이고, cat, fox, wolf는 dog의 자식노드(child node)이다.

따라서 root node를 제외한 트리의 모든 node들은 유일한 부모 노드를 가진다.

 

트리에서 형제관계

부모가 도일한 노드들을 형제(sibling) 관계라고 부른다. 위 그림에서는 cat, fox, wolf가 형제관계이다.

 

리프(leaf)노드란?

자식이 없는 노드들을 리프노드라고 부른다. 위 그림에서는 fox, wolf, canine가 리프노드이다.

 

내부(internal)노드란?

리프노드가 아닌 노드들을 내부노드라고 부른다.

 

트리에서 조상-자손 관계

부모-자식 관계를 확장한 것이 조상-자손(ancestor-descendant) 관계이다. 위 그림에서 dog는 canine의 조상노드이고, canine은 cat의 자손노드이다.

 

부트리=서브트리(subtree)란?

트리에서 어떤 한 노드와 그 노드의 자손들로 이루어진 트리를 부트리(subtree)라고 부른다.

 

 

 

 

 

 

트리에서 레벨은 아래의 그림과 같이 쓰인다. 또한, 여기서 트리의 높이(height)는 서로 다른 레벨의 개수를 의미하는데, 아래 그림의 트리의 높이는 3이다.

 

 

 

 

트리의 기본적인 성질

≫ 노드(node)가 N개인 트리는 항상 N-1개의 링크(link)를 가진다.

≫ 루트에서 어떤 노드로 가는 경로가 유일하다. 또한 임의의 두 노드 간의 경로도 유일하다.

     (같은 노드를 두 번 이상 방문하지 않는다는 전제하)

 

 


 

이진 트리 (binary tree)

≫ 이진 트리에서 각 노드는 최대 2개의 자식을 가진다.

≫ 각각의 자식 노드는 자신이 부모의 왼쪽 자식인지 오른쪽 자식인지가 지정된다. (자식이 한 명인 경우에도)

 

 

이진트리 응용 예 

이진 트리 응용의 예 중에서 하나를 소개하자면 다음과 같은 수식을 표현한 그래프이다.

출처 - 영리한 프로그래밍을 위한 알고리즘 강좌

( x + y ) * ( ( a + b ) / c ) 의 연산을 트리로 표현하면 위의 그림과 같은 것이 된다. 

 

 

 

또 다른 이진 트리 응용의 예는 'Huffman code'이다. 

출처 - 영리한 프로그래밍을 위한 알고리즘 강좌

Huffman code란 어떤 데이터를 압축하거나 인코딩하는 가장 기본적인 알고리즘 중 하나이다.

예를 들어 어떤 텍스트 파일이 있고, 그 파일을 구성하는 문자는 a-z까지의 알파벳으로 구성되어 있다고 가정해보자. 이 파일에 담긴 알파벳을 적절하게 인코딩하여 최종적으로 그 파일의 길이 최소가 되도록 하는 파일 압축과 관련된 알고리즘 중 하나가 Huffman code이다.

Huffman code에서는 각각 알파벳에 부여된 이진 코드들을 위 그림과 같이 하나의 트리의 형태로 표현할 수 있다.

 

예를 들어 a는 1 0 1 0으로 인코딩 된다는 의미이다. 마찬가지로 b는 1 0 0 0 0 0로, e는 0 1 0으로 인코딩 되는 것을 의미한다. 

출처 - 영리한 프로그래밍을 위한 알고리즘 강좌

 

 

 

 

Full and Complete Binary Trees 

 

Full Binary Tree란? 

모든 레벨에서 노드들이 채워져 있는 트리.

≫ 높이가 h인 full binary tree는 항상 2^h-1개의 노드를 가진다.

≫ 노드가 N개인 full 이진트리의 높이는 O(logN)이다.

    노드가 N개인 이진트리의 높이는 최악의 경우 N이 될 수도 있다.

 

 

 

Complete Binary Tree란? 

맨 마지막 레벨을 제외한 모든 레벨의 노드들이 채워져 있는 트리.

맨 마지막 레벨 몇 개의 노드가 없을 수 있는데, 오른쪽에서 부터 연속된 노드만 빈자리가 될 수 있다.

≫ 노드가 N개인 full 이진트리의 높이는 O(logN)이다.

    노드가 N개인 이진트리의 높이는 최악의 경우 N이 될수도 있다.

 

 

 

 

이진트리의 표현

출처 - 영리한 프로그래밍을 위한 알고리즘 강좌

일반적인 이진트리가 된다면 (full 이진트리나 complete 이진트리와 같이 특별한 경우가 아니라면),

규칙성이 성립하지 않기 때문에 이진트리를 표현할 때 연결구조를 이용해서 표현할 수밖에 없다.

각각의 노드가 자기 다음의 노드 주소를 가지고 있는 연결구조이다. 

 

 

예를 들어 아래의 그림 왼쪽 상단의 트리를 연결 구조로 나타내면 다음과 같다.

출처 - 영리한 프로그래밍을 위한 알고리즘 강좌

 

 

위 내용은 '영리한 프로그래밍을 위한 알고리즘 강좌'를 공부하면서 정리한 것입니다.

728x90