트리의 구현과 순회

트리의 구현과 순회

개요

선형으로 표현하기 어려운 형태의 자료 중 흔한 것으로 자료 간에 상하위 관계나 포함 관계가 존재하는 계층 구조가 있다. 그리고 이 계층적 구조를 갖는 자료들을 표현하기 위한 자료 구조가 바로 트리(tree)이다. 이름의 유래를 말해보자면

하나의 상위 개념에서 가지를 쳐서 뻗어나가는 모습이 실제 나무(Tree)와 닮았다고 해서 트리라고 부른다고 한다.

트리는 처음에 현실 세계의 개념을 추상화해 표현하는 자료 구조로 고안되었지만, 탐색형 자료 구조로도 유용하게 쓰인다. 특정 조건을 지키도록 구성된 트리들을 이용하면 배열이나 리스트를 사용하는 것보다 같은 작업을 더 빠르게 할 수 있기 때문이다.

어떤 형태로 트리를 구성하느냐, 자료들을 어떻게 배치하느냐에 따라 다양한 형태의 트리가 있을 수 있으며, 이들을 이용해 다양한 문제를 빠르게 풀 수 있다.

기초적인 정의와 용어

트리는 자료가 저장된 노드들이 간선으로 서로 연결외어 있는 자료 구조를 말하며 노드 간에는 상/하위 관계가 있고 두 노드가 연결되었을 때 한 노드는 좀더 상위, 다른 노드는 좀더 하위에 있어야 한다.

- 트리의 구성 요소

- 트리와 노드의 속성

루트에서 어느 노드에 도달하기 위해 거쳐야 하는 간선의 수를 해당 노드의 깊이라고 하며, 가장 깊숙히 있는 노드의 깊이를 해당 트리의 높이(height)라고 한다.

- 트리의 재귀적 속성

트리가 유용하게 사용되는 큰 이유 중 하나는 트리가 재귀적인 성질을 갖고 있다는 것이다. 트리에서 한 노드와 그의 자손 노드들을 모두 모으며 그들도 하나의 트리가 된다. 이것을 서브트리라고 말하며, 따라서 모든 트리는 루트와 루트 밑에 있는 서브트리들의 집합이라고 말할 수 있다. 이와같은 성질 때문에 트리를 다루는 코드들은 대개 재귀 호출을 이용해 구현된다.

- 트리의 표현

트리는 굉장히 다양한 방법으로 구현할 수 있지만, 그 중 가장 일반적인 형태는 각 노드를 하나의 구조체/객체로 표현하고 이들을 서로 포인터로 연결하는 것이다. 이때 각 노드들은 자신의 부모와 모든 자손들에 대한 포인터를 가지고 있다.

물론 모든 트리가 이처럼 구현되는 것은 아니다. 트리의 구조나 사용 용도가 제한되어 있는 탐색용 트리에서는 효율성을 위해서 좀 더 단순한 형태의 구현을 자주 사용하게 되는데 대표적인 예로 왼쪽, 오른쪽에 최대 하나씩의 자식만을 가지는 이진 검색 트리가 있다.

from http://sweet-smell.tistory.com/140 by ccl(A) rewrite - 2021-12-07 02:27:16