문제 1 · 일반 트리와 이진 트리의 차이
문제 1 [3점]
일반적인 트리tree와 이진 트리binary tree의 차이점을 서술(1점)하고, 두 트리의 노드node 구조를 구현할 때의 차이점을 서술(2점)하시오.
풀이 및 해설
개념적 차이
- 일반 트리: 각 노드가 가질 수 있는 자식의 수에 제한이 없다(0개부터 여러 개까지). 자식들 사이에 순서가 있을 수도, 없을 수도 있다.
- 이진 트리: 각 노드가 자식을 최대 2개(왼쪽·오른쪽)만 가지며, 왼쪽·오른쪽이 구별된다. 자식이 하나뿐이어도 그것이 왼쪽인지 오른쪽인지 의미가 있다.
노드 구조 구현의 차이
이진 트리: 자식 수가 최대 2로 고정이므로, 노드에 포인터를 딱 두 개만 둔다.
cppstruct BinNode { T data; BinNode* left; BinNode* right; };일반 트리: 자식 수가 가변이라 포인터를 고정 개수로 둘 수 없다. 두 가지 방법을 쓴다.
- 자식 리스트: 각 노드가 자식 포인터들의 배열이나 연결 리스트를 가진다.
- 왼쪽 자식-오른쪽 형제 표현left-child right-sibling: 포인터를 2개만 두되, 하나는 첫째 자식, 다른 하나는 다음 형제를 가리킨다. 이렇게 하면 임의 차수의 일반 트리를 이진 트리 형태로 저장할 수 있다.
cppstruct GenNode { T data; GenNode* firstChild; // 첫째 자식 GenNode* nextSibling; // 다음 형제 };
즉 이진 트리는 자식 수가 고정되어 직접 좌·우 포인터로 간단히 구현되지만, 일반 트리는 자식 수가 가변이라 자식 리스트나 첫 자식-다음 형제 방식으로 우회해 구현한다.