반응형
트리(tree) 방문 프로그램
※ 참고 : 트리는 노드(node)라 부르는 원소들로 구성된다. 또한 루트(root) 노드를 하나 보유하는데, 루트를 제외한 나머지 노드들은 서로 별개인 부트리(subtree)로 나눌 수 있다.
■ 2진 트리(Binary tree) : 두 개 이하의 자손을 원소로 갖는 트리
● 이진 트리 구조는 왼쪽 자손(left offspring), 오른쪽 자손(right offspring)이라는 두개의 링크 필드를 가진 자료 구조로 간주할 수 있으므로, 이러한 표현 방식을 따르면 잎 노드는 왼쪽 자손과 오른쪽 자손의 값을 NULL로 가지는 노드이다.
■ 2진 트리의 원소를 방문하는 방법
● 중위순(inorder) : 왼쪽 부트리 -> 루트 -> 오른쪽 부트리 순으로
● 전위순(preorder) : 루트 -> 왼쪽 부트리 -> 오른쪽 부트리 순으로
● 후위순(postorder) : 왼쪽 부트리 -> 오른족 부트리 -> 루트 순으로
// A linked list implementation of a queue. #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <ctype.h> typedef char DATA; struct NODE { DATA d; NODE *left; NODE *right; }; typedef NODE* BTREE; BTREE create_tree(DATA a[], int i, int size); BTREE init_node(DATA d1, BTREE p1, BTREE p2); BTREE new_node(void); void inorder(BTREE root); void preorder(BTREE root); void postorder(BTREE root); int main() { BTREE t; DATA a[] = "GAHBEIJCDF"; int size = 10; //size of a[] t = create_tree(a, 0, size); printf("inorder binary tree traversal: "); inorder(t); printf("\n"); printf("preorder binary tree traversal: "); preorder(t); printf("\n"); printf("postorder binary tree traversal: "); postorder(t); printf("\n"); } //create a linked binary tree from an array BTREE create_tree(DATA a[], int i, int size) { if (i >= size) { return NULL; } else { return (init_node(a[i], create_tree(a, 2 * i + 1, size), create_tree(a, 2 * i + 2, size))); } } //initialize a node in a binary tree BTREE init_node(DATA d1, BTREE p1, BTREE p2) { BTREE t; t = new_node(); t->d = d1; t->left = p1; t->right = p2; return t; } //create a new node BTREE new_node(void) { BTREE t; t = (BTREE)malloc(sizeof(NODE)); assert(t != NULL); return t; } //inorder binary tree traversal void inorder(BTREE root) { if (root != NULL) { preorder(root->left); //recur left printf("%c ", root->d); preorder(root->right); //recur right } } //preorder binary tree traversal void preorder(BTREE root) { if (root != NULL) { printf("%c ", root->d); preorder(root->left); preorder(root->right); } } //postorder binary tree traversal void postorder(BTREE root) { if (root != NULL) { postorder(root->left); postorder(root->right); printf("%c ", root->d); } }
반응형