(TIL) C++ Tree Traversal ~
업데이트:
Preorder Traversal
순회(traversal)란 트리의 노드를 체계적으로 방문하는 방법이다. 그 중 전위 순회(preorder traversal)는 부모 노드를 먼저 방문한 후 자식 노드를 순서대로 재귀적으로 방문하는 방식이다.
Postorder Traversal
후위 순회(postorder traversal)은 자식 노드를 모두 방문한 후 부모 노드를 방문하는 방식이다. 후위 순회는 부모 노드의 속성이 자식 노드의 속성에 의해 결정되는 트리에서 부모 노드의 속성을 알아내야 할 때 유용하다.
이진트리(Binary Trees)
이진 트리는 다음과 같은 특징을 가진 ‘순서가 있는’ 트리이다.
- 모든 노드는 최대 두 개의 자식 노드를 가진다.
- 모든 자식 노드는 왼쪽 자식, 오른쪽 자식으로 이름 붙여진다.
- 왼쪽 자식이 오른쪽 자식에 선행한다.
이진 트리는 다음과 같이 재귀적으로 표현할 수도 있다. 부모 노드, 그리고 왼쪽 서브 이진 트리, 오른쪽 서브 이진 트리. 그리고 재귀적 표현이기 때문에 각 서브 이진 트리도 그렇게 표현된다.
이진 트리의 추상 데이터 타입
이진 트리는 이전의 다른 노드 기반 자료구조들과 마찬가지로 각 노드는 원소를 가지고 있고 이 노드는 position이라는 객체와 연결되어있다. * 연산자를 오버로딩 함으로써 *position으로 노드에 접근할 수 있다. position p는 다음과 같은 연산을 지원한다.
- p.left() 노드의 왼쪽 자식을 반환한다.
- p.right() 노드의 오른쪽 자식을 반환한다.
- p.parent() 노드의 부모 노드를 반환하다.
- p.isRoot() 노드가 루트 노드인지 여부를 반환한다.
- p.isExternal() 노드가 잎 노드인지 반환한다.
그리고 트리 자체도 몇 가지 연산을 지원한다.
- size() 트리 내 노드의 개수를 반환한다.
- empty() 트리가 비어있는지 아닌지를 반환한다.
- root() 루트 노드를 반환한다.
- positions() 트리 내 모든 노드의 position 객체를 리스트 형태로 반환한다.
C++에서의 인터페이스 구현은 다음과 같다.
template <typename E> // base element type
class Position<E> { // a node position
public:
E& operator*(); // get element
Position left() const; // get left child
Position right() const; // get right child
Position parent() const; // get parent
bool isRoot() const; // root of tree?
bool isExternal() const; // an external node?
};
template <typename E> // base element type
class BinaryTree<E> { // binary tree
public: // public types
class Position; // a node position
class PositionList; // a list of positions
public: // member functions
int size() const; // number of nodes
bool empty() const; // is tree empty?
Position root() const; // get the root
PositionList positions() const; // list of nodes
};
이진 트리의 속성
이진 트리는 자식 노드의 최대 개수가 정해져 있다는 점에서 노드의 깊이와 노드 개수 간의 관계에 특징이 있다. 그 특징은 다음과 같다.
- h+1 ≤ n ≤ 2^(h+1) −1
- 1 ≤ nE ≤ 2^h
- h ≤ nI ≤ 2^h −1
- log(n+1)−1 ≤ h ≤ n−1
nE는 잎 노드 nI는 일반 노드를 말한다.
오늘은 여기까지…. 내일은 이진 트리의 구현에 대해서 배운다.
댓글남기기