4 v 13 include stdio h include stdlib
4. 이진 트리의 순회 v 이진 트리 순회하기 프로그램(1/3) #include <stdio. h> #include <stdlib. h> #include <memory. h> typedef struct tree. Node { // 연결 자료구조로 구성하기 위해 트리의 노드 정의 char data; struct tree. Node *left; // 왼쪽 서브 트리에 대한 링크 필드 struct tree. Node *right; // 오른쪽 서브 트리에 대한 링크 필드 } tree. Node; // data를 루트 노드로 하여 왼쪽 서브 트리와 오른쪽 서브 트리를 연결하는 연산 tree. Node* make. Root. Node(char data, tree. Node* left. Node, tree. Node* right. Node) { tree. Node* root = (tree. Node *)malloc(sizeof(tree. Node)); root->data = data; root->left = left. Node; root->right = right. Node; return root; } // 이진 트리에 대한 전위 순회 연산 void preorder(tree. Node* root) { if (root) { printf("%c", root->data); preorder(root->left); preorder(root->right); } }
4. 이진 트리의 순회 v 이진 트리 순회하기 프로그램(2/3) // 이진 트리에 대한 중위 순회 연산 void inorder(tree. Node* root) { if (root) { inorder(root->left); printf("%c", root->data); inorder(root->right); } } // 이진 트리에 대한 후위 순회 연산 void postorder(tree. Node* root) { if (root) { postorder(root->left); postorder(root->right); printf("%c", root->data); } }
4. 이진 트리의 순회 v 이진 트리 순회하기 프로그램(3/3) void main() { // (A*B-C/D) 수식 이진 트리 만들기 tree. Node* n 7 = make. Root. Node('D', NULL); tree. Node* n 6 = make. Root. Node('C', NULL); tree. Node* n 5 = make. Root. Node('B', NULL); tree. Node* n 4 = make. Root. Node('A', NULL); tree. Node* n 3 = make. Root. Node('/', n 6, n 7); tree. Node* n 2 = make. Root. Node('*', n 4, n 5); tree. Node* n 1 = make. Root. Node('-', n 2, n 3); printf("n preorder : "); preorder(n 1); printf("n inorder : "); inorder(n 1); printf("n postorder : "); postorder(n 1); getchar(); }
4. 이진 트리의 순회 v 후위 순회를 이용한 컴퓨터 폴더 용량 계산 프로그램 #include <stdio. h> #include <stdlib. h> #include <memory. h> typedef struct tree. Node { // 트리의 노드 구조 정의 int size; // 데이터 필드 struct tree. Node *left; // 왼쪽 서브 트리에 대한 링크 필드 struct tree. Node *right; // 오른쪽 서브 트리에 대한 링크 필드 } tree. Node; int Folder. Size = 0; // size를 루트 노드의 데이터 필드로 하여 왼쪽과 오른쪽 서브 트리를 연결하는 연산 tree. Node* make. Root. Node(int size, tree. Node* left. Node, tree. Node* right. Node) { tree. Node* root = (tree. Node *)malloc(sizeof(tree. Node)); root->size = size; root->left = left. Node; root->right = right. Node; return root; } // 각 폴더 크기를 계산하기 위한 후위 순회 연산 int postorder_Folder. Size(tree. Node* root) { if (root) { postorder_Folder. Size(root->left); postorder_Folder. Size(root->right); Folder. Size += root->size; } return Folder. Size; }
4. 이진 트리의 순회 v 후위 순회를 이용한 컴퓨터 폴더 용량 계산 프로그램 void main() { } tree. Node* F 11 = make. Root. Node(120, NULL); tree. Node* F 10 = make. Root. Node(55, NULL); tree. Node* F 9 = make. Root. Node(100, NULL); tree. Node* F 8 = make. Root. Node(200, NULL); tree. Node* F 7 = make. Root. Node(68, F 10, F 11); tree. Node* F 6 = make. Root. Node(40, NULL); tree. Node* F 5 = make. Root. Node(15, NULL); tree. Node* F 4 = make. Root. Node(2, F 8, F 9); tree. Node* F 3 = make. Root. Node(10, F 6, F 7); tree. Node* F 2 = make. Root. Node(0, F 4, F 5); tree. Node* F 1 = make. Root. Node(0, F 2, F 3); printf("nn C: \의 용량 : %d M n", postorder_Folder. Size(F 2)); Folder. Size = 0; printf("n D: \의 용량 : %d M n", postorder_Folder. Size(F 3)); Folder. Size = 0; printf("n 내 컴퓨터의 전체 용량 : %d M n", postorder_Folder. Size(F 1)); getchar();
4. 이진 트리의 순회 v 스레드 이진 트리 프로그램(1/2) #include <stdio. h> #include <stdlib. h> #include <memory. h> typedef struct tree. Node { // 스레드 이진 트리의 노드 정의 char data; struct tree. Node *left; // 왼쪽 서브 트리에 대한 링크 필드 struct tree. Node *right; // 오른쪽 서브 트리에 대한 링크 필드 int is. Thread. Right; // 후속자에 대한 스레드 태그 필드 } tree. Node; // data를 루트 노드로 하여 왼쪽 서브 트리와 오른쪽 서브 트리를 연결하는 연산 tree. Node* make. Root. Node(char data, tree. Node* left. Node, tree. Node* right. Node, int is. Thread. Right) { tree. Node* root = (tree. Node *)malloc(sizeof(tree. Node)); root->data = data; root->left = left. Node; root->right = right. Node; root->is. Thread. Right = is. Thread. Right; return root; } // 후속자 노드를 반환하는 연산 tree. Node *find. Thread. Successor(tree. Node* p) { tree. Node *q = p->right; if (q == NULL) return q; if (p->is. Thread. Right == 1) return q; while (q->left != NULL) q = q->left; return q; }
4. 이진 트리의 순회 v 스레드 이진 트리 프로그램(2/2) // 스레드 이진 트리의 중위 순회 void thread. Inorder(tree. Node* root) { tree. Node * q; q = root; while (q->left) q = q->left; do { printf("%3 c", q->data); q = find. Thread. Successor(q); } while (q); } void main() { // (A*B-C/D) 수식 이진 트리 만들기 tree. Node* n 7 = make. Root. Node('D', NULL, 0); tree. Node* n 6 = make. Root. Node('C', NULL, 1); tree. Node* n 5 = make. Root. Node('B', NULL, 1); tree. Node* n 4 = make. Root. Node('A', NULL, 1); tree. Node* n 3 = make. Root. Node('/', n 6, n 7, 0); tree. Node* n 2 = make. Root. Node('*', n 4, n 5, 0); tree. Node* n 1 = make. Root. Node('-', n 2, n 3, 0); n 4 ->right = n 2; n 5 ->right = n 1; n 6 ->right = n 3; printf("n 스레드 이진 트리의 중위 순회 : "); thread. Inorder(n 1); } getchar();
- Slides: 57