티스토리 뷰
본 포스팅 시리즈에서는 모든 프로그래머들이 반드시 알아야 할 가장 기본적인 자료구조를 다룰 예정이다.
앞으로 다룰 내용은 프로그래머에게 기본 소양이며, 본인 스스로 직접 구현할 수 있어야 한다.
| 다섯 번째 순서는 트리이다.
트리는 계층적으로 구성되어 있고 서로 연결되어있는 데이터에 적합한 계층적 자료구조이다. 이 구조는 링크드 리스트 와는 다른 자료구조이지만, 링크된 요소끼리는 선형 순서로 링크드 리스트라고도 볼 수 있다. 트리는 오래전부터 다양한 형태로 계속 연구되어 발전되어 왔고, 활용되었으며 또 특정 상황 및 애플리케이션에 맞는 제약사항을 가지게 되었다. 트리의 형태로는 대부분이 알고 있는 이진 탐색 트리부터 B 트리, 레드 블랙 트리, AVL 트리 등이 있다.
이진 탐색 트리는 말 그대로 데이터가 계층적으로 구조되어 있는 이진트리이다. 다만 이진트리와 차이점은 이진 탐색 트리는 데이터가 일정 기준으로 정렬되어 저장된다는 것이다. 그 기준은 아래와 같다.
- 왼쪽 자식의 모든 서브 트리는 항상 부모노드의 값보다 작다
- 오른쪽 자식의 모든 서브 트리는 항상 부모노드의 값보다 크다.
추후 구현할 Heap또한 이 이진트리 기반으로 구현된다.
다음은 가장 기본적인 TreeNode의 구현 사항이다.
struct TreeNode{
int val;
TreeNode * left;
TreeNode * right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
}
노드는 노드의 값과 왼쪽 자식, 오른쪽 자식과 연결을 위한 포인터 등으로 구성된다.
보통 이진 트리를 탐색하는 방법은 총 3가지가 있는데, root를 기준으로 root를 먼저(Pre-Order) 탐색하거나,
중간(In-Order)에 탐색, 혹은 마지막(Post-Order)으로 탐색하는 방법이 있다. 재귀 함수를 이용해 간단하게 구현할 수 있는 부분이다.
void PreOrder(TreeNode* root) {
if(root == nullptr) return;
cout << root->val << endl;
PreOrder(root->left);
PreOrder(root->right);
}
void InOrder(TreeNode* root) {
if(root == nullptr) return;
InOrder(root->left);
cout << root->val << endl;
InOrder(root->right);
}
void PostOrder(TreeNode* root) {
if(root == nullptr) return;
PostOrder(root->left);
PostOrder(root->right);
cout << root->val << endl;
}
사실 트리라고 하면 보통 이진트리를 떠올리지만, 앞서 설명한 대로 자식이 2개가 아닌 경우가 많다. 트리의 자식 노드가 2개 이상일 수 있고, 또한 자식에서 부모 노드로의 연결도 표현할 수 있다. 또한, 트리의 자료형 또한 다양하게 나타날 수 있다. 아래 예를 확인하자.
template <typename T>
class TreeNode{
private:
T data;
TreeNode *parent;
vector<TreeNode*> children;
public:
void PrintData(TreeNode* root) {
cout << root->data << endl;
for(int i = 0; i< childeren.size(); i++) {
PrintData(root->childeren[i]);
}
}
int height(TreeNode* root) {
int h = 0;
for(int i = 0; i< root->children.size(); i++) {
h = max(h, 1 + height(root->children[i]));
}
return h;
}
}
'IT > 자료구조, 알고리즘' 카테고리의 다른 글
Data Structure in C++ - Hash (0) | 2022.08.31 |
---|---|
Data Structure in C++ - Heap (0) | 2022.08.29 |
Data Structure in C++ - Queue (0) | 2022.08.23 |
Data Structure in C++ - Stack (0) | 2022.08.23 |
Data Structure in C++ - Linked List (0) | 2022.08.23 |
- Total
- Today
- Yesterday
- Tree
- rust
- 속초 맛집
- 맛집
- 코딩인터뷰
- Interview
- PS
- Medium
- DP
- 속초
- 러스트 입문
- 알고리즘
- 기술면접
- 솔직후기
- 트리
- 리트코드
- C++
- algorithm
- 러스트 배우기
- Problem Solving
- 러스트 기초
- 내돈내산
- 러스트
- 인터뷰
- LeetCode
- coding interview
- 자료구조
- interview question
- ProblemSolving
- 반드시 알아야 할 자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |