[문제1] 트리의 순회(선위순회, 중위순회, 후위순회)
- 다음과 같이 트리를 구현
- 없는 노드번호를 입력받는다면, -1출력
- 선위순회는 1, 중위순회는 2, 후위순회는 3
- id를 입력받아서 그 노드부터 순회를 하여 출력
입력예시 출력예시
1 2 |
30 70 90 |
입력예시 출력예시
2 3 |
50 130 120 80 |
입력예시 출력예시
1 9 |
-1 |
#include<stdio.h> #include<stdlib.h> struct node { int id; int data; struct node *left; struct node *right; }; void addLeftchild(struct node *parent, int value, int id){ struct node *newnode = (struct node*)malloc(sizeof(struct node)); newnode->data = value; newnode->id = id; newnode->left = NULL; newnode->right = NULL; parent->left = newnode; } void addRightchild(struct node *parent, int value, int id){ struct node *newnode = (struct node*)malloc(sizeof(struct node)); newnode->data = value; newnode->id = id; newnode->left = NULL; newnode->right = NULL; parent->right = newnode; } void preOrder(struct node *tree){ if (tree == NULL) { return; } printf(" %d", tree->data); preOrder(tree->left); preOrder(tree->right); } void inOrder(struct node *tree) { if (tree == NULL) { return; } inOrder(tree->left); printf(" %d", tree->data); inOrder(tree->right); } void postOrder(struct node *tree){ if (tree == NULL) { return; } postOrder(tree->left); postOrder(tree->right); printf(" %d", tree->data); } void freeTree(struct node *tree) { if (tree == NULL) { return; } freeTree(tree->left); freeTree(tree->right); free(tree); } void treeOrder(struct node *tree, int order, int id) { if (tree == NULL) { return; } if (tree->id == id) { if (order == 1) { preOrder(tree); } else if (order == 2) { inOrder(tree); } else if (order == 3) { postOrder(tree); } } else { treeOrder(tree->left, order, id); treeOrder(tree->right, order, id); } } void main(){ int order, id; struct node *root, *p, *tree = (struct node*)malloc(sizeof(struct node)); root = tree; tree->data = 20; tree->id = 1; tree->left = NULL; tree->right = NULL; addLeftchild(tree, 30, 2); addRightchild(tree, 50, 3); addLeftchild(tree->left, 70, 4); addRightchild(tree->left, 90, 5); addRightchild(tree->right, 120, 6); addLeftchild(tree->right->right, 130, 7); addRightchild(tree->right->right, 80, 8); scanf("%d", &order); scanf("%d", &id); if ((1 <= id) && (id <= 8)) { treeOrder(root, order, id); printf("\n"); } else { printf("-1\n"); } freeTree(root); } |
[문제2] 위 문제에서 id를 받아서 부트리의 용량의 합을 계산하는 프로그램
- 합을 계산할 때 입력된 id의 노드도 포함
입력예시 출력예시
3 |
380 |
입력예시 출력예시
4 |
70 |
입력예시 출력예시
9 |
-1 |
#include<stdio.h> #include<stdlib.h> struct node { int id; int data; struct node *left; struct node *right; }; void addLeftchild(struct node *parent, int value, int id){ struct node *newnode = (struct node*)malloc(sizeof(struct node)); newnode->data = value; newnode->id = id; newnode->left = NULL; newnode->right = NULL; parent->left = newnode; } void addRightchild(struct node *parent, int value, int id){ struct node *newnode = (struct node*)malloc(sizeof(struct node)); newnode->data = value; newnode->id = id; newnode->left = NULL; newnode->right = NULL; parent->right = newnode; } int preOrder(struct node *tree){ if (tree == NULL) { return 0; } return tree->data + preOrder(tree->left) + preOrder(tree->right); } void freeTree(struct node *tree) { if (tree == NULL) { return; } freeTree(tree->left); freeTree(tree->right); free(tree); } void treeOrder(struct node *tree, int id) { if (tree == NULL) { return; } if (tree->id == id) { printf("%d\n",preOrder(tree)); } else { treeOrder(tree->left, id); treeOrder(tree->right, id); } } void main(){ int id; struct node *root, *p, *tree = (struct node*)malloc(sizeof(struct node)); root = tree; tree->data = 20; tree->id = 1; tree->left = NULL; tree->right = NULL; addLeftchild(tree, 30, 2); addRightchild(tree, 50, 3); addLeftchild(tree->left, 70, 4); addRightchild(tree->left, 90, 5); addRightchild(tree->right, 120, 6); addLeftchild(tree->right->right, 130, 7); addRightchild(tree->right->right, 80, 8); scanf("%d", &id); if ((1 <= id) && (id <= 8)) { treeOrder(root, id); } else { printf("-1\n"); } freeTree(root); } |
'알고리즘' 카테고리의 다른 글
[알고리즘] 우선순위 큐(1) - 설명 (0) | 2018.12.07 |
---|---|
[알고리즘] 기본 추상자료형(10) - 예제(트리ADT) (0) | 2018.12.05 |
[알고리즘] 기본 추상자료형(8) - 예제(트리ADT) (0) | 2018.12.05 |
[알고리즘] 기본 추상자료형(7) - 설명(트리ADT, 이진트리ADT) (0) | 2018.12.05 |
[알고리즘] 기본 추상자료형(6) - 예제(큐ADT/데크ADT) (0) | 2018.11.29 |