트리(tree)의 부품
노드(node)는 키(key)를 담는 칸, 간선(edge)은 두 노드를 잇는 선, 루트(root)는 부모가 없는 시작 노드, 자식이 없는 노드는 잎(leaf)입니다. 어떤 노드 아래의 전체 묶음이 부분 트리(subtree)이고 빈 자식 자리는 nil입니다.
5. Grundlegende Datenstrukturen (7 Punkte)
선행지식이 전혀 없어도 이 페이지 하나에서 용어를 배우고, 작은 예제를 거쳐 실제 시험 풀이와 검산까지 따라가도록 구성했습니다.
시험 문언과 숫자·배점은 비공식 복기 자료 lines 246-268에서 가져왔습니다. 정의와 알고리즘은 현재 강의 Lecture 03 pp.46-51, 66-71, 80-81 및 Sheet05-GrpSol pp.7-12로 교차 확인했습니다. 이 문제의 key는 모두 서로 다르며, duplicate가 있는 일반 BST에서는 강의나 구현이 정한 equality 방향을 먼저 밝혀야 합니다.
기호를 모른 채 풀이를 외우지 않도록, 이 문제에서 실제로 쓰는 뜻과 작은 예를 먼저 확인합니다.
| 기호·용어 | 뜻 | 작은 예 |
|---|---|---|
| 노드(node / Knoten) | 키(key) 하나와 왼쪽·오른쪽 자식 연결을 담는 트리의 한 칸입니다. | 37이 전체 트리의 루트 노드입니다. |
| 간선(edge / Kante) | 부모와 자식 사이를 잇는 선이며 왼쪽 간선과 오른쪽 간선은 서로 다른 의미를 가집니다. | 37에서 15로 가는 선은 왼쪽 간선입니다. |
| 빈 포인터(nil) | 그 방향에 자식 노드가 없다는 뜻입니다. 값 0이나 실제 키가 아닙니다. | \(56.\text{left}=\text{nil}\)56.left=nil이므로 search(50)는 그 자리에서 실패합니다. |
| 왼쪽/오른쪽(L / R) | 현재 키와 목표를 비교한 뒤 각각 왼쪽 또는 오른쪽 자식으로 이동한다는 경로 표기입니다. | 23의 경로는 \(37(L)\to 15(R)\to 29(L)\)37(L)→15(R)→29(L)입니다. |
| 이진 탐색 트리(BST) | 모든 노드에서 왼쪽 부분 트리의 키는 더 작고 오른쪽 부분 트리의 키는 더 큰 트리입니다. | 15의 왼쪽에는 7, 오른쪽에는 29가 놓입니다. |
| 전위/중위 순회(Pre / In) | 전위 순회(Preorder)는 root-left-right, 중위 순회(Inorder)는 left-root-right 순서로 같은 트리를 읽는 규칙입니다. | 루트 37은 전위 순회의 첫 값이고 중위 순회의 가운데 분할점입니다. |
Preorder는 root를 가장 먼저 알려 주고, Inorder는 root를 기준으로 왼쪽 subtree와 오른쪽 subtree의 원소 집합을 나눠 줍니다. 두 정보를 번갈아 사용하면 트리를 재귀적으로 복원할 수 있습니다.
이 문제의 key는 모두 서로 다릅니다. 따라서 Inorder에서 root 위치가 하나로 정해지고, 왼쪽·오른쪽 구간도 모호하지 않아 결과 트리가 유일합니다.
BST의 Inorder는 원래 오름차순이므로 주어진 Inorder가 BST 조건과 일치하는지도 먼저 확인할 수 있습니다.
전위 순회(Preorder)는 root-left-right, 중위 순회(Inorder)는 left-root-right입니다. 이름의 pre와 in은 루트(root)를 언제 읽는지를 나타냅니다.
복원에서는 전위 순회의 첫 원소로 루트를 찾고 중위 순회에서 그 루트 왼쪽과 오른쪽에 있는 값들을 부분 트리(subtree) 집합으로 나눕니다.
핵심 규칙\operatorname{Pre}(T)=N\to L\to R
\operatorname{In}(T)=L\to N\to R전위 순회의 첫 값 37이 전체 루트입니다. 중위 순회에서 37 왼쪽 [7,15,29]는 왼쪽 부분 트리, 오른쪽 [56,85]는 오른쪽 부분 트리입니다.
전위 순회에서도 왼쪽 부분 트리에는 원소 3개가 있으므로 다음 세 값 [15,7,29]가 왼쪽, 남은 [56,85]가 오른쪽입니다.
\operatorname{root}(T)=37L=\{7,15,29\}R=\{56,85\}왼쪽 전위 순회의 첫 값 15가 왼쪽 부분 트리 루트입니다. 중위 순회 [7,15,29]에서 7은 왼쪽, 29는 오른쪽이므로 15의 두 자식이 됩니다.
오른쪽 전위 순회의 첫 값 56이 오른쪽 부분 트리 루트이고 중위 순회 [56,85]에서 56 왼쪽은 비어 있고 85가 오른쪽 자식입니다.
핵심 규칙15.\mathrm{left}=7,\qquad 15.\\(\text{mathrm}{\text{right}}=29\)mathrm{right}=29
핵심 규칙56.\mathrm{left}=\varnothing,\qquad 56.\\(\text{mathrm}{\text{right}}=85\)mathrm{right}=85
완성한 트리를 전위 순회로 읽어 원문 [37,15,7,29,56,85]가 나오는지 확인합니다. 이어 중위 순회로 읽어 [7,15,29,37,56,85]인지 확인합니다.
두 순회가 모두 일치하면 단순히 이진 탐색 트리처럼 보이는 정도가 아니라 주어진 정보 전체를 만족한 것입니다.
핵심 규칙\operatorname{Pre}(T_{\mathrm{answer}})=\operatorname{Pre}_{\mathrm{input}}
핵심 규칙\operatorname{In}(T_{\mathrm{answer}})=\operatorname{In}_{\mathrm{input}}
서로 다른 두 sequence가 어떻게 하나의 tree 그림을 결정하는지 이해하면 traversal을 단순 암기하지 않고, root와 subtree라는 재귀 구조를 실제로 읽을 수 있습니다. 이후 BST 복원·직렬화 문제의 기본 도구가 됩니다.
노드(node)는 키(key)를 담는 칸, 간선(edge)은 두 노드를 잇는 선, 루트(root)는 부모가 없는 시작 노드, 자식이 없는 노드는 잎(leaf)입니다. 어떤 노드 아래의 전체 묶음이 부분 트리(subtree)이고 빈 자식 자리는 nil입니다.
이진 트리는 노드마다 왼쪽·오른쪽 자식을 최대 하나씩 갖습니다. 이진 탐색 트리는 여기에 모든 왼쪽 부분 트리 키가 작고 모든 오른쪽 부분 트리 키가 크다는 전역 약속을 더합니다.
트리를 바꾸는 연산이 아니라 같은 트리의 노드를 어느 순서로 읽을지 정한 규칙입니다. 전위 순회는 root-left-right, 중위 순회는 left-root-right입니다.
Pre=[10,5,20], In=[5,10,20]입니다.같은 숫자가 중복되지 않으므로 중위 순회에서 루트의 위치가 하나뿐입니다. 중복 키가 있으면 같은 값을 어느 쪽에 둘지 규칙이 추가로 필요합니다.
전위 순회(Preorder)는 장 제목을 먼저 읽고 그 아래 절을 읽는 목차이며, 중위 순회(Inorder)는 왼쪽 절을 읽은 뒤 장 제목을 만나고 오른쪽 절을 읽는 목록이라고 생각합니다. 같은 장 제목을 두 목록에서 맞추면 양쪽 절 묶음이 드러납니다.
비유의 한계: 실제 목차는 제목이 중복될 수 있지만 이 문제의 key는 모두 다릅니다. 비유는 방문 순서와 분할만 설명하며 BST의 수치 대소 관계 자체를 대신하지 않습니다.
각 프레임은 Preorder 첫 값을 root로 표시하고 Inorder의 같은 값 양옆을 subtree로 나눕니다. 원소 수가 정해지면 Preorder의 다음 구간 길이도 자동으로 정해집니다.
Preorder [10,5,20], Inorder [5,10,20]인 서로 다른 key 세 개를 먼저 복원해 봅니다.
Preorder는 root를 가장 먼저 출력하므로 첫 값 10이 전체 root입니다.
\(\text{루트}=10\)root=1010 왼쪽의 5는 left subtree, 오른쪽의 20은 right subtree 원소입니다.
\(L=[5], R=[20]\)L=[5], R=[20]각 구간에 원소가 하나뿐이므로 5와 20은 더 분할할 child가 없는 leaf입니다.
5 ← \(10 \to 20\)10 → 20작은 예제의 결론: Preorder가 root를 알려 주고 Inorder가 양쪽 원소 집합을 알려 주면 각 작은 subtree에서도 같은 절차를 반복할 수 있습니다.
Preorder의 첫 값은 현재 subtree의 root이므로 37입니다. Inorder 첫 값 7을 root로 고르는 것이 아닙니다.
Inorder에서 37 앞의 [7,15,29]가 left subtree, 뒤의 [56,85]가 right subtree입니다.
왼쪽 Preorder 구간 [15,7,29]의 첫 값 15가 root이고, Inorder [7,15,29]가 7과 29를 양쪽으로 나눕니다.
오른쪽 Preorder 첫 값 56이 root이며 Inorder [56,85]에서 56 왼쪽은 비고 85가 오른쪽에 있기 때문입니다.
unique-key BST에서는 Lecture 03처럼 Preorder의 root보다 작은 연속 구간과 큰 구간만으로도 복원 가능합니다. 주어진 Inorder는 일반 binary-tree 방식의 분할과 강력한 검산에 사용합니다.
힌트: root 위치만 알고 left subtree의 크기를 아는지 생각합니다.
정답: 아닙니다. 일반 binary tree는 Preorder 하나만으로 left/right 구간 경계를 알 수 없어 여러 shape가 가능합니다.
힌트: root보다 작은 값과 큰 값은 갈 수 있는 방향이 정해집니다.
정답: BST 대소 관계가 Preorder 뒤 원소를 left와 right subtree로 나누므로 각 구간에서 재귀적으로 root를 정할 수 있습니다.
각 단계에서 무엇을 했는지, 왜 그렇게 했는지, 결과가 무엇인지 차례대로 확인합니다.
Preorder 첫 값 \(37 \to \)37 →전체 root
Inorder를 37에서 분할 → left [7,15,29], right [56,85]
왼쪽 Preorder [15,7,29]의 \(\text{루트} 15 \to \text{children} 7,29\)root 15 → children 7,29
오른쪽 Preorder [56,85]의 \(\text{루트} 56 \to \text{right} \text{child} 85\)root 56 → right child 85
37을 root로 둔다. Inorder에서 37 왼쪽 [7,15,29], 오른쪽 [56,85]로 나눈다. 왼쪽 subtree root는 15이고 children은 7,29이다. 오른쪽 subtree root는 56이고 right child는 85이다.
복기 문언, 강의 정의, 공식 연습 풀이, 추가 유도를 구분해 표시합니다.
AuD Gedächtnisprotokoll SoSe 2025.md · lines 246-268 · 신뢰도/범위: 비공식 기억 복기5번의 sequence, 삽입·검색 key, 소문항 요구와 배점
정확한 시험 문언의 공식 공개본이 아니라 복기 자료이므로 강의 정의와 별도로 표시합니다.
Vorlesung\03BasicDataStructures.pdf · pp. 46-51 · 신뢰도/범위: 현재 강의 슬라이드binary tree·subtree·nil·height 용어와 Inorder/Preorder/Postorder 정의
Vorlesung\03BasicDataStructures.pdf · pp. 66-71 · 신뢰도/범위: 현재 강의 슬라이드BST invariant, unique-key BST의 Preorder 복원, Inorder 비유일성, search와 insertion
Vorlesung\03BasicDataStructures.pdf · pp. 80-81 · 신뢰도/범위: 현재 강의 슬라이드BST 연산 \(O(h)\)O(h), balanced와 degenerate height 차이
Übung\AuD26_Sheet05-GrpSol.pdf · pp. 7-10 · 신뢰도/범위: 공식 풀이BST insertion, traversal, reconstruction을 단계별로 그리는 현재 풀이 방식
Übung\AuD26_Sheet05-GrpSol.pdf · pp. 11-12 · 신뢰도/범위: 공식 풀이search path의 ancestor bound와 위반 경로 판정
마지막 생성: 2026-08-02 08:51