이진 트리
- 이진 트리는 포인터를 이용하여 구현하면 효과적인 데이터 관리가 가능
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
struct Node *leftChild;
struct Node *rightChild;
} Node;
Node* initNode(int data, Node* leftChid, Node* rightChild) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->leftChild = leftChid;
node->rightChild = rightChild;
return node;
}
이진 트리 순회
- 이진 트리에 담긴 데이터를 하나씩 방문하는 방법으로는 대표적으로 세 가지가 있음
1. 전위 순회
- 자기 자신을 출력
- 왼쪽 자식을 방문
- 오른쪽 자식을 방문
void preorder(Node* root) {
if (root) {
printf("%d ", root->data);
preorder(root->leftChild);
preorder(root->rightChild);
}
}
2. 중위 순회
- 왼쪽 자식을 방문
- 자기 자신을 출력
- 오른쪽 자식을 방문
void inorder(Node* root) {
if (root) {
preorder(root->leftChild);
printf("%d ", root->data);
preorder(root->rightChild);
}
}
3. 후위 순회
- 왼쪽 자식을 방문
- 오른쪽 자식을 방문
- 자기 자신을 출력
void postorder(Node* root) {
if (root) {
preorder(root->leftChild);
preorder(root->rightChild);
printf("%d ", root->data);
}
}
* 이진 트리 사용해보기
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
struct Node *leftChild;
struct Node *rightChild;
} Node;
Node* initNode(int data, Node* leftChid, Node* rightChild) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->leftChild = leftChid;
node->rightChild = rightChild;
return node;
}
void preorder(Node* root) {
if (root) {
printf("%d ", root->data);
preorder(root->leftChild);
preorder(root->rightChild);
}
}
void inorder(Node* root) {
if (root) {
preorder(root->leftChild);
printf("%d ", root->data);
preorder(root->rightChild);
}
}
void postorder(Node* root) {
if (root) {
preorder(root->leftChild);
preorder(root->rightChild);
printf("%d ", root->data);
}
}
int main(void) {
Node* n7 = initNode(50, NULL, NULL);
Node* n6 = initNode(37, NULL, NULL);
Node* n5 = initNode(23, NULL, NULL);
Node* n4 = initNode(5, NULL, NULL);
Node* n3 = initNode(48, n6, n7);
Node* n2 = initNode(17, n4, n5);
Node* n1 = initNode(30, n2, n3);
preorder(n1);
printf("\n");
inorder(n1);
printf("\n");
postorder(n1);
system("pause");
return 0;
}