쓰레드 이진트리
(중위 순회) 스레드: 오른쪽 자식이 없으면서 마지막 순회할 노드가 아닌 노드 < 왼쪽은 이미 처리되서 순회할 필요가 없으므로 위같이 정의한다 >
스레드인 노드는 right필드에 다음 순회할 노드(중위 후속자)를 삽입한다. find_sucessor메소드를 통해 스레드면 right를 출력하고 스레드가 아니면 받은 노드의 오른쪽 서브 노드를 기준으로 다시 왼쪽으로 쭉 가게 해서 반복한다. (자세한건 책이나 ppt참고)
스레드 덕분에 중위 후속자를 계속 찾을 수 있고 반복적 버전이 가능하다!
#include <stdio.h> #include <stdlib.h> typedef struct Tree { int data; struct Tree * left; struct Tree * right; int is_thread; }TreeNode; void insert_right(TreeNode *t, TreeNode *right, int data, int thread) { //right인수는 스레드면 중위 후속자가 전달 됨,아니면 null이 전달 TreeNode * ptr = (TreeNode *)malloc(sizeof(TreeNode)); ptr->data = data; ptr->right = right; ptr->left = NULL; ptr->is_thread = thread; t->right = ptr; } void insert_left(TreeNode *t, TreeNode *right, int data, int thread) { //right인수는 스레드면 중위 후속자가 전달 됨,아니면 null이 전달 TreeNode * ptr = (TreeNode *)malloc(sizeof(TreeNode)); ptr->data = data; ptr->right = right; ptr->left = NULL; ptr->is_thread = thread; t->left = ptr; } TreeNode * find_sucessor(TreeNode *t) { TreeNode * tright = t->right; if (tright == NULL || t->is_thread == 1) return tright; else { while (tright->left != NULL) tright = tright->left; return tright; } } void thread_inorder(TreeNode *t) { TreeNode *r; r = t; // 원본 데이터가 손상되지 않게 복사본을 만들어 준 후 작업을 진행한다. while (r->left != NULL) r = r->left; // 가장 왼쪽 노드로 이동한다. do { if (r->data == '+' || r->data == '*' || r->data == '/') printf("%c ", r->data); else printf("%d ", r->data); r = find_sucessor(r); // 중위후속자를 찾는 함수를 호출한다. } while (r != NULL); // 중위후속자가 존재하는 한 계속 무한반복 } void inorder_rec(TreeNode *t) { if (t != NULL) { inorder_rec(t->left); if (t->data == '+' || t->data == '*' || t->data == '/') printf("%c ", t->data); else printf("%d ", t->data); inorder_rec(t->right); } } TreeNode cons_threadTree(TreeNode * root) { // root 노드 root->data = '+'; root->is_thread = 0; insert_left(root, NULL, '*', 0); insert_right(root, NULL, '/', 0); // root노드의 왼쪽 서브 트리 insert_left(root->left, root->left, 3, 1); insert_right(root->left, root, 2, 1); // root노드의 오른쪽 서브 트리 insert_left(root->right, root->right, 30, 1); insert_right(root->right, NULL, 6, 0); return *root; } int main() { TreeNode T; T = cons_threadTree(&T); printf("중위 순회의 반복적 버전: "); thread_inorder(&T); }