SlideShare a Scribd company logo
1 of 16
Download to read offline
C3조 과제물 발표



            조장 : 09박구남
            조원 : 07이용재
                09김현호
                09송하윤
                11정예린

    - 1 -
과제수행일지
                                            조원소개
              C3 조
                                  조장             박구남
소 속                              자료조사          송하윤, 김현호
                                프로그래밍          이용재, 정예린
                              주   제

연구제목    상호 참조 생성기

        트리를 이용하여 하나 이상의 문장을 입력 하였을때 단어들의 개수,Line를 나타낼 수 있
연구배경    으며 이것을 응용 할 수 있다.

                             참 고 자 료
                             과제의 수행
 첫째날                2012    년       5 월         8   일     화요일
회의 주제                      조원 자기소개 및 역할분담, 과제 파악

        조장 : 박구남
        자료조사 : 김현호, 송하윤
        프로그래밍 : 이용재, 정예린

        이상과 같이 이번 프로젝트의 역할분담을 실시했습니다.

        첫 수업시간에 문제 파악을 위해 토의를 진행 하면서 각자 역할 분담을 하였습니다.


        트리(Tree)
        트리(Tree)
        트리 회로. 나무가 하나의 뿌리(Root)에서 줄기가 나와 가지로 나누어지는 것처럼, 어떤
회의 내용   하나의 집합으로부터 하위 레벨로 가지가 나오는 집합 관계를 갖는 계층 구조를 말한다.
        부분적으로도 결코 루트를 형성하는 경우는 없다. 따라서 처음에 가지가 나오기 시작되
        고 있는 집합으로부터 차례대로    가지 를 더듬어가면 목적의 집합을 찾을 수 있다. 정
        보 처리 분야에는 이 같은 트리 구조를 가진 개념이 많이 있다.




        트리의 조건
        1) 트리의 노드 중 1개의 Root Node가 있어야 한다.
        2) Root Node를 제외한 노드들을 n개 (n>=0)의 부분집합으로 나누어지며, 각 부분집합
        은 하나의 트리이다. 이때 각 부분집합을 subtree라고 한다.
용어.
트리의 용어.
Node
 트리를 표현하는 구성요소.
Root Node
 트리에서 최상위 레벨에 있는 노드(트리의 처음 노드).
Degree of Node
 노드에서 children Node의 수.
Degree of a Tree
 트리를 형성하는 모든 노드의 차수에서 최대값.
Sub tree
 트리에서 Root Node를 제외한 모든 트리.
Ancestor Node
 Root Node에서 임의의 노드 까지의 경로를 형성하는 노드.
Descendent Node
 트리에서 임의의 하위노드에 연결된 모든 노드.
Parent Node
 임의의 노드에 연결된 바로 위의 노드.
Children Node
 임의에 노드에 연결된 바로 아래의 노드.
sibling
 동일한 Parent Node를 가지는 노드.
Branch Node
 Root Node와 Leaf Node를 제외한 모든 노드.
Leaf Node
 노드의 차수가 0인 노드(트리의 마지막노드).
Level
 트리에서 Root Node부터 한단계씩 내려가면서 1씩 증가한다.
Height(Depth)
 트리의 최대 레벨.
Path
 어떤 임의의 노드로부터 임의의 노드에 이르는 동안에 연결된 일련의 노드의 집합. 경
로의 길이는 경로를 구성하는 노드의 수보다 1이 작다.


    표현방법.
트리의 표현방법.
트리의 표현방법으로는 리스트, 집합, 막대 그래프, 배열, 연결리스트 등이 있다.


       방법.
트리의 분류 방법


                  - 2 -
트리는 그래프의 일종으로서 Direct Tree 와 Undirect Tree, General Tree와 Binary
       Tree 등으로 구분된다.


       General Tree.
       1)Ordered Tree & Oriented Tree
        트리에서 레벨의 같은 노드들의 순서가 중요한 경우를 Ordered Tree라고 하고, 노드의
       순서가 중요하지 않은 경우에는 Oriented Tree라고 한다.
       2)Similar Tree & Equivalent Tree
        임의의 트리가 2개 주어졌을때 트리를 구성하는 전체 노드의 수와 좌우 배열 위치등과
       같은 외형적인 부분이 같을 경우 Similar Tree 라고 하고, 노드의 내용까지 같은 경우
       Equivalent Tree라고 한다.


       Binary Tree
        일반트리와는 다르게 중요한 형태의 자료 객체로 차수가 2이하인 트리이다. 즉, 일반트
       리에서는 노드의 공백이 존재할 수 없지만, Binary Tree에서는 존재 가능하며, 왼쪽과
       오른쪽 SubTree가 독립적이다.
       1) Full Binary Tree
        Depth가 i인 Binary Tree에서 연결될 수 있는 최대의 노드가 연결되어진 트리를 말하
       며 노드의 수는 2i-1개이다.
       2) Complete Binary Tree
        level이 i인 노드의 수를 n이라 할 때 2^i-1 -1<n<2^i -1을 만족하는 트리.
       3)Knuth Binary Tree
         각 노드의 차수가 2이하인 트리.
       4)사향이진트리
        Root Node를 중심으로 왼쪽이나 오른쪽 한 방향으로 기울어진 트리.

       zz
       조원들 모두 기본적인 트리의 형태만 알고 있었으며, 트리의 종류,표현방법,프로그래밍에
       응용 하는 방법은 모두 알지 못하여 자료조사를 하며 알아보기로 토의 하였습니다.
 반성

둘째날               2012 년        5 월       10 일     목요일
회의주제                     AVL트리의 균형방법 및 정의
       서로가 조사해온 내용을 바탕으로 알고리즘을 만들기에 앞서 균형트리에 관하여 교수님
       께
         AVL 트리
       AVL 트리는 Adelson-Velskii와 Landis에 의해 1962년에 제안된 트리로써 각 노들에 왼
       쪽 서브 트리의 높이와 오른쪽 서브트리의 높이 차잉가 1 이하인 이진 탐색 트리를 말한
       다. AVL트리는 트리가 비균형 상태로 되면 스스로 노드들을 재배치하여 균형 상태로 만
회의내용   든다. 따라서 AVL 트리는 균형 트리가 항상 보장되기 때문에 탐색시간이 O(logn) 시간
       안에 끝나게 된다. 또한 삽입과 삭제 연산도 O(logn) 시간 안에 할 수 있다. 하지만 레드
       -블랙 트리보다 효율이 떨어지기 때문에 자주 사용되지는 않는다.
        AVL 트리에서 균형 인수는 매우 중요하다. 균형 인수(Balancing Factor)란 [왼쪽 서브
       트리의 높이 - 오른쪽 서브 트리의 높이]로 정의 된다. 모든 노드의 균형 인수가 1 이
       하이면 AVL 트리이다. 아래의 사진은 모든 균형 인수가 적절하기 때문에 AVL 트리라고
       할 수 있다.




                               - 3 -
삽입 연산
원소를 하나 삽입하게 된다면 이진 탐색 트리의 삽입 규칙에 따라 우선 노드를 위치시킨
다. 그리고 모든 노드에 대한 균형인수가 1 내에 값이면 균형이 유지된 것이므로 삽입
과정을 마친다. 하지만 모든 노드 중 한 노드의 균형 인수만이라도 그 범위를 벗어나면
        균형을 맞춰주기 위한 "회전(Rotation)" 작업을 해주어야 한다.
AVL 트리에서 균형이 깨지는 타입은 4가지가 있다. 각각의 타입을 살펴보도록 하자. 새
로 추가되는 노드를 N, 가장 가까우면서 균형인수가 2가 된 조상 노드를 A라고 하자.
- LL : N이 A의 왼쪽 서브트리의 왼쪽에 삽입되는 경우
- LR : N이 A의 왼쪽 서브트리의 오른쪽에 삽입되는 경우
- RR : N이 A의 오른쪽 서브트리의 오른쪽에 삽입되는 경우
- RL : N이 A의 오른쪽 서브트리의 왼쪽에 삽입되는 경우




               [LL]                   [LR]


이렇게 균형이 깨지는 경우에서 균형 트리로 다시 변경하기 위해서 수행하는 회전 또한
                    각각 다르다.
- LL : A부터 N까지의 경로 상의 노드들을 오른쪽으로 회전시킨다.(단순회전)
- LR : A부터 N까지의 경로 상의 노드들을 왼쪽-오른쪽으로 회전시킨다.(이중회전)
- RR : A부터 N까지의 경로 상의 노드들을 왼쪽으로 회전시킨다.(단순회전)
- RL : A부터 N까지의 경로 상의 노드들을 오른쪽-왼쪽으로 회전시킨다.(이중회전)
LL과 RR 회전, LR과 RL 회전이 각각 대칭적으로 동작하게 된다.


LL 부터 설명하자면, 일단 바로 위 그림을 보자. 세개의 원소를 정확하게 재배치하기 위
해선 세개 중 중간값을 부모에 위치시키고 나머지를 각각 왼쪽, 오른쪽 자식으로 삼으면
될 것이다. 따라서 A가 부모가 되고 B는 A의 왼쪽 자식 노드 위치를 고수하며, C는 A의



                      - 4 -
오른쪽 자식 노드가 된다. A의 오른쪽 자식 노드는 C의 왼쪽 자식 노드가 된다.
          다음으로 LR 을 보자. 먼저 A가 B의 자리에 위치하고 B는 A의 왼쪽 자식 노드가 된다.
          A의 기존 왼쪽 자식 노드는 B의 오른쪽 자식 노드가 된다. 이렇게 첫번째 회전이 완료되
                          고 두번째 회전은 LL과 동일하다.
          회전에 대한 습득은 글로만 읽어서는 절대 익힐 수 없으니, 다른 책을 보면서 실제로 수
          행하보길 바란다. 위 그림의 경우보다 복잡한 경우(균형 인수가 4인 경우도 볼 수 있다)
                          도 많으니 연습이 필수적이다.




          [출처] 균형 이진 탐색 트리 - AVL 트리, 레드-블랙 트리|
           출처]
          -균형트리(AVL)에 관하여 내용을 이해 할 수 있었으나 이것을 코딩에 적용 하는것이
          쉽지않았음.
 문제점

 셋째날                                 2012     년             5 월                    15   일         화요일
 회의주제                                                   프로그램 초안 분석
          #include   <stdio.h>
          #include   <stdlib.h>
          #include   <conio.h>
          #include   <windows.h>
          #include   <string.h>
          struct Node {
                        char name;
                        Node *link[26];
                        int page[26];
                        int count;
                        int spot;
                        };
          Node addtree (Node *A, Node *B);
          Node AddNode (char A);
          Node Delnode (Node *A, char B);
          int search (Node *A, char B);
          int searchspot (Node *A, char B);
          void Printans (Node *A, char ans[], int x);

          int main () {
           int i,j,x,z;
           int check=0;
           FILE *point;
           char a = 'R';
           int m=0;
프로그램 초안      printf("진행중
                     진행중");
          // printf("진행중");
            Node *tree = (Node *)malloc(sizeof(Node));
             printf("진행중
                     진행중");
          // printf("진행중");
           point=fopen("C://file.txt","r");
                      if(point==NULL)
                      {
                                return 1;
                      }
           i = 0;
           j = 1;
           z = 0;
           tree[i] = AddNode(a);
                               //텍스트                          저장.
                      while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장.
                      {
                                 a=fgetc(point);
                                  if(a>=65 && a<=90)
                                  {
                                           a+=32;
                                  }

                                  if(a>=97 && a<=122) // 알파벳이면 노드 진행
                                  {printf("%c",a);
                                             check = search(&tree[i],a); // 노드 있는지 확인
                                                                                            이동.
                                              if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동.




                                                    - 5 -
tree[j] = AddNode(a);
               tree[j].spot = j;
               tree[i] = addtree(&tree[i],&tree[j]);
               i = j;
               j++;
                            } else {
                            i = searchspot(&tree[i],a);
                                                 이동.
                            } // 노드가 있으면 그대로 위치만 이동.
                            } else if(a==' ' || a=='n') {               일시,     증가.     root로 복귀.
                                                              // 공백이나 n 일시, 카운터 증가. 그리고 root로 복귀.
                             tree[i].count++;
                             tree[i].page[z]=1;
                             i = 0;

                             } else if(a=='+') {
                                   z++;
                             } else if(a==EOF) {break; // 아무 것도 없을 시 종료
                             }
              }


              fclose(point);
char ANS[50] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
printf("nWord Count Linesn");

Printans(&tree[0],ANS,0); // 출력

              system("PAUSE");
                        getch();
        return 0;
}




Node addtree (Node *A, Node *B) {

    for (int i = 0; i < 26 ; i++) {
          if (A->link[i] == NULL) {
                           A -> link[i] = B;
                           printf("%c의 LINK%d에 %c를
                           printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name);
                           break;
                         }
          }

    return *A;
    }
Node AddNode (char A) {

    Node *B = (Node *)malloc(sizeof(Node));
    B->name = A;
    for (int i = 0; i < 26 ; i++) {
                                   B->link[i] = NULL;
                                   B->page[i] = 0;

          }
               B->count = 0;
               B -> spot = 0;
    return *B;
    }

Node Delnode (Node *A, char B) {

    for (int i = 0; i < 26 ; i++) {




                                                  - 6 -
if (A -> link[i] != NULL ) {
                   if (A -> link[i] -> name == B) {
                       A -> link[i] = NULL;
                       printf("%c에 LINK&d에 %c를
                       printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); }
                       }
                   }

       return *A;
            }


       int search (Node *A, char B) {
            int x = 0;
            int i;
            for (i = 0; i < 26 ; i++) {
                   if (A -> link[i] != NULL ) {
                   if (A -> link[i] -> name == B) {
                   x = 1;
                   break;
                   }
                   } else break;
                   }

                   return x;
            }
       int searchspot (Node *A, char B) {


            for (int i = 0; i < 26 ; i++) {
                   if (A -> link[i] != NULL ) {
                   if (A -> link[i] -> name == B) {return A -> link[i] -> spot;}
                   }
                   }

       return 0;
            }
       void Printans (Node *A, char ans[], int x) {
                                   ans[x] = A -> name;

            for (int i = 0 ; i < 26 ; i++) {
                   if (A -> count != 0) {
                         for (int j=0; j<=x; j++) {
                         printf("%c %d", ans[j],A->count);
                         }
                         for (int j=0; j<=26; j++) {
                               if (A->page[j] == 1) {
                                      printf("%d",j+1);
                                      }
                               }
                         } else {}
                   if (A->link[i] != NULL) {
                                   Printans( A->link[i],ans,x);
                                   } else {}
                   }
            return;
       } // 출력


       프로그램 초안을 분석하여 프로그램 실행이 되기위하여 어떤식으로 바꿔보면 좋을지 조원들과
       토의를 진행 하였음.
회의내용

문제점    프로그램 초안 분석을 한 결과 오류가 발생 하였는데 무엇 때문에 오류가 발생 하였는지




                                                          - 7 -
찾지를 못하여 헤매었음. 주위 지인의 도움을 받아 문제점을 찾아 보려고 하였으나, 찾지
       못하여 문자열을 배열에 옮겨서 풀어보기로 하였음.
넷째날              2012 년      5 월                                     17     일   목요일
회의주제                      프로그램 보완
       #include   <stdio.h>
       #include   <stdlib.h>
       #include   <conio.h>
       #include   <windows.h>
       #include   <string.h>
       struct Node {
                       char name;
                       Node *link[26];
                       int page[26];
                       int count;
                       int spot;
                       };
       Node addtree (Node *A, Node *B);
       Node AddNode (char A);
       Node Delnode (Node *A, char B);
       int Search (Node *A, char B);
       int Searchspot (Node *A, char B);
       void Printans (Node *A, char ans[], int x);

       int main () {
        int i,j,x,z;
        int check=0;
        FILE *point;
        char arr[100];
        int a;
        int m=0;
        int Sizec;
          printf("진행중
                  진행중");
       // printf("진행중");
         Node *tree = (Node *)malloc(sizeof(Node));
          printf("진행중
                  진행중");
       // printf("진행중");
        point=fopen("D://file.txt","r");
프로그램              if(point==NULL)
                  {
수정안                         return 1;
                  }

                           //텍스트
                  while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장.         저장.
                  {
                            a=fgetc(point);
                            if((a>=65 && a<=90) || (a>=97 && a<=122))
                            {
                                      arr[m]=a;
                                      if(a==EOF)
                                      {
                                                break;
                                      }
                                      else
                                      {
                                                m++;
                                      }
                            }
                            else if(a==' ' || a=='n')
                            {
                                      arr[m]=' ';
                                      if(a==EOF)
                                      {
                                                break;
                                      }
                                      else
                                      {
                                                m++;
                                      }
                            }
                            else
                            {
                                      if(a==EOF)
                                      {
                                                break;
                                      }
                            }
                  }
                  fclose(point);
                                   //배열에                           저장.
                  for(i=0;i<m;i++) //배열에 저장된 문자들을 소문자로 변환하여 다시 배열에 저장.




                                              - 8 -
{
                      if(arr[i]>=65 && arr[i]<=90)
                      {
                                arr[i]=arr[i]+32;
                      }
                      printf("%c",arr[i]);
           }
            fclose(point);
printf("n");

 Sizec = m;
 i = 0;
 j = 1;
 z = 2;
 m = 0;
 tree[i] = AddNode('R');
                   {//텍스트                          저장.
           for(;;) {//텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장.

                      if(arr[m]>='a' && arr[m]<='z') {// 알파벳이면 노드 진행
                      printf("%cn",arr[m]);
                                check = Search(&tree[i],arr[m]); // 노드 있는지 확인



                                   if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동.
                                                                                 이동.
               tree[j] = AddNode(arr[m]);
                               j;//노드
               tree[j].spot = j;//노드 위치를 저장.  저장.
               tree[i] = addtree(&tree[i],&tree[j]);
               i = j; // i는 진행 노드
               j++; // 노드 생성 위치
                          } else {
                          i = Searchspot(&tree[i],arr[m]);
                           printf("%d - %cn",i,tree[i].name);
                          } // 노드가 있으면 그대로 위치만 이동.         이동.




                         } else if(arr[m]==' ' || arr[m]=='n') {                      일시,     증가.
                                                                            // 공백이나 n 일시, 카운터 증가.
    root로 복귀.
그리고 root로 복귀.
                             tree[i].count++; // 단어 갯수 표기
                             tree[i].page[z]=1; // 등장 페이지 표기
                             i = 0;
                                                                                정의함.
                             } else if(arr[m]=='.') {// 임의로 다음페이지를 나타내는 기호를 + 로 정의함.
                                   z++;
                             } else if(arr[m]==EOF) {break; // 아무 것도 없을 시 종료
                             }
                             if (Sizec < m) break;
                             m++;
           }

 char                                                  ANS[50]                                                =
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // 영단어 최
                 1000자가
장 길이 단어는 1000자가 넘어가지만 일반적으로 50자 미만.                  50자 미만.
 printf("nWord Count Linesn");

 Printans(&tree[0],ANS,0); // 출력

           system("PAUSE");
                   getch();
       return 0;
}

Node addtree (Node *A, Node *B) {

     for (int i = 0; i < 26 ; i++) {
          if (A->link[i] == NULL) {
                            A -> link[i] = B;
                            printf("%c의 LINK%d에 %c를
                            printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name);
                            break;
                         } else {}

          }

     return *A;




                                            - 9 -
}



Node AddNode (char A) {

     Node *B = (Node *)malloc(sizeof(Node));
     B->name = A;
     for (int i = 0; i < 26 ; i++) {
                             B->link[i] = NULL;
                             B->page[i] = 0;

            }
                B->count = 0;
                B -> spot = 0;
     return *B;
     }

Node Delnode (Node *A, char B) {

     for (int i = 0; i < 26 ; i++) {
         if (A -> link[i] != NULL ) {
         if (A -> link[i] -> name == B) {
                A -> link[i] = NULL;
                printf("%c에 LINK&d에 %c를
                printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); }
                }
            }

return *A;
     }

int Search (Node *A, char B) {
     int x = 0;
     int i;
     for (i = 0; i < 26 ; i++) {
            if (A -> link[i] != NULL ) {
            if (A -> link[i] -> name == B) {
            x = 1;
            break;
            }
            } else {break;}
            }

            return x;
     }

int Searchspot (Node *A, char B) {


     for (int i = 0; i < 26 ; i++) {
            if (A -> link[i] != NULL ) {
            if (A -> link[i] -> name == B) {return A -> link[i] -> spot;}
            }
            }

return 0;
     }



void Printans (Node *A, char ans[], int x) {
     ans[x] = A -> name;
     int i;
     int j;




                                       - 10 -
if (A -> count != 0) {
                           printf("단어
                           printf("단어 : ");
                           for (j=0; j<=x; j++) {
                           printf("%c", ans[j]);
                           }
          //                 printf("%c", A->name);
                               printf("등장
                               printf("등장 횟수 : ");
                               printf("%d",A->count);

                               printf("등장
                               printf("등장 페이지 : ");
                               for (j=0; j<26; j++) {
                                   if (A ->page[j] == 1) {
                                         printf("%d n",j+1);
                                         }
                                   }
                               }
                 for (i = 0 ; i < 26 ; i++) {
                     if (A->link[i] != NULL) {
                     if (A -> spot != 0) x+=1;
                     Printans( A->link[i],ans,x);
                                       } else {}
                     }
               return;
          } // 출력


          초안 소스에서 오류가 발생하였는데 오류를 찾지 못하여 문자열을 배열에 옮겨풀어보기
          로 하여 분리 시켜보기로 하였음.
 회의내용
          문자열을 배열에 옮겨 풀어 본 후 else구문을 if 구문으로 바꾼후 실행하니 오류는 발생
 문제점      하지 않았음. 그러나 6글자를 넘어서 입력 될 경우 오류가발생됨.
          오류를 찾으려 하였으나 찾지 못하였음.
                                                   결과 발표
          #include   <stdio.h>
          #include   <stdlib.h>
          #include   <conio.h>
          #include   <windows.h>
          #include   <string.h>
          struct Node {
                          char name;
                          Node *link[26];
                          int page[26];
                          int count;
                          int spot;
                          };
          Node addtree (Node *A, Node *B);
          Node AddNode (char A);
          Node Delnode (Node *A, char B);
          int Search (Node *A, char B);
          int Searchspot (Node *A, char B);
프로그램 소스   void Printans (Node *A, char ans[], int x);

          int main () {
           int i,j,x,z;
           int check=0;
           FILE *point;
           char arr[100];
           int a;
           int m=0;
           int Sizec;
             printf("진행중
                     진행중");
          // printf("진행중");
               Node *tree = (Node *)malloc(sizeof(Node));
             printf("진행중
                     진행중");
          // printf("진행중");
           point=fopen("C://file.txt","r");
                      if(point==NULL)
                      {




                                                        - 11 -
return 1;
           }

                    //텍스트
           while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장.         저장.
           {
                     a=fgetc(point);
                     if((a>=65 && a<=90) || (a>=97 && a<=122) || (a == '+'))
                     {
                               arr[m]=a;
                               if(a==EOF)
                               {
                                         break;
                               }
                               else
                               {
                                         m++;
                               }
                     }
                     else if(a==' ' || a=='n')
                     {
                               arr[m]=' ';
                               if(a==EOF)
                               {
                                         break;
                               }
                               else
                               {
                                         m++;
                               }
                     }
                     else
                     {
                               if(a==EOF)
                               {
                                         break;
                               }
                     }
           }
           fclose(point);
                              //배열에                         저장.
           for(i=0;i<m;i++) //배열에 저장된 문자들을 소문자로 변환하여 다시 배열에 저장.
           {
                     if(arr[i]>=65 && arr[i]<=90)
                     {
                                arr[i]=arr[i]+32;
                     }
                     printf("%c",arr[i]);
           }
            fclose(point);
printf("n");
 Sizec = m;
 i = 0;
 j = 1;
 z = 0;
 m = 0;
 tree[i] = AddNode('R');
                   {//텍스트                          저장.
           for(;;) {//텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장.

                      if(arr[m]>='a' && arr[m]<='z') {// 알파벳이면 노드 진행
//                    printf("%cn",arr[m]);
                                check = Search(&tree[i],arr[m]); // 노드 있는지 확인

                                   if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동.
                                                                                 이동.
               tree[j] = AddNode(arr[m]);
                               j;//노드
               tree[j].spot = j;//노드 위치를 저장.  저장.
               tree[i] = addtree(&tree[i],&tree[j]);
               i = j; // i는 진행 노드
               j++; // 노드 생성 위치
                          } else {
                          i = Searchspot(&tree[i],arr[m]);
                           printf("%c가           내려갑니다.n",tree[i].name);
                           printf("%c가 존재하여 내려갑니다.n",tree[i].name);
                          } // 노드가 있으면 그대로 위치만 이동.         이동.
                         }

                         if(arr[m]==' ' || arr[m]=='n') {                일시,     증가.
                                                               // 공백이나 n 일시, 카운터 증가. 그리고
root로 복귀.
root로 복귀.
                             tree[i].count++; // 단어 갯수 표기
                             tree[i].page[z]=1; // 등장 페이지 표기
                             i = 0;
                             }
                                                                         정의함.
                             if(arr[m]=='+') {// 임의로 다음페이지를 나타내는 기호를 + 로 정의함.
                                    z++;




                                         - 12 -
}
                           if(arr[m]==EOF) {break; // 아무 것도 없을 시 종료
                           }
                           if (Sizec < m) break;
                           m++;
             }




 char                                                  ANS[50]                                                =
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // 영단어 최
                 1000자가
장 길이 단어는 1000자가 넘어가지만 일반적으로 50자 미만.                  50자 미만.
 printf("nWord Count Linesn");

 Printans(&tree[0],ANS,0); // 출력

             system("PAUSE");
                     getch();
         return 0;
}
Node addtree (Node *A, Node *B) {

     for (int i = 0; i < 26 ; i++) {
           if (A->link[i] == NULL) {
                             A -> link[i] = B;
                             printf("%c의 LINK%d에 %c를
                             printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name);
                             break;
                          } else {}

           }
           return *A;
     }
Node AddNode (char A) {

     Node *B = (Node *)malloc(sizeof(Node));
     B->name = A;
     for (int i = 0; i < 26 ; i++) {
                                B->link[i] = NULL;
                                B->page[i] = 0;

           }
                 B->count = 0;
                 B -> spot = 0;
     return *B;
     }
Node Delnode (Node *A, char B) {

     for (int i = 0; i < 26 ; i++) {
         if (A -> link[i] != NULL ) {
         if (A -> link[i] -> name == B) {
                 A -> link[i] = NULL;
                 printf("%c에 LINK&d에 %c를
                 printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); }
                 }
           }
return *A;
     }
int Search (Node *A, char B) {
     int x = 0;
     int i;
     for (i = 0; i < 26 ; i++) {
           if (A -> link[i] != NULL ) {
           if (A -> link[i] -> name == B) {
           x = 1;
           break;
           }




                                         - 13 -
} else {break;}
                   }

                   return x;
            }
       int Searchspot (Node *A, char B) {


            for (int i = 0; i < 26 ; i++) {
                   if (A -> link[i] != NULL ) {
                   if (A -> link[i] -> name == B) {return A -> link[i] -> spot;}
                   }
                   }
       return 0;
            }

       void Printans (Node *A, char ans[], int x) {
            ans[x] = A -> name;
            int i;
            int j;

                   if (A -> count != 0 && A -> name != 'R' ) {
                         printf("단어
                         printf("단어 : ");
                         for (j=0; j<=x; j++) {
                         printf("%c", ans[j]);
                         }
       //                  printf("%c", A->name);
                         printf("등장
                         printf("등장 횟수 : ");
                         printf("%d",A->count);

                         printf("등장
                         printf("등장 페이지 : ");
                         for (j=0; j<26; j++) {
                               if (A ->page[j] == 1) {
                                     printf("%d n",j+1);
                                     }
                               }
                         }
            for (i = 0 ; i < 26 ; i++) {
                   if (A->link[i] != NULL) {
                   if (A -> spot != 0) x+=1;
                   Printans( A->link[i],ans,x);
                                   } else {}
                   }
            return;
       } // 출력




문제화면




                                                  - 14 -
맨위 노드는 비움


                space 부분을 기준으로 단어를 떼어내고 맨 앞 글자를 2level 노드에
                                      넣는다.


알고리즘 개요         맨앞 글자가 같을 경우 그다음 하위 레벨에 다음 문자를 넣는다.


                      없을 경우 단어를 순서대로 한 문자씩 넣는다.


                 두 개의 트리(1line,2line)를 만들고 비교하여 노드를 비교 하여
                                  출력한다




          문자 입력이 6개 이상 들어가면 오류가 발생.
          입력 양식은 +가 페이지 구분선이고 마지막에 띄워쓰기나 엔터를 하여야 종료.
          균형트리의 구현과정에서 구현을 하기가 어려워서 배열로 받아서 처리하는 방식으로 사
 최종 반성

          용 하였습니다.




                             - 15 -

More Related Content

What's hot

Python+numpy pandas 1편
Python+numpy pandas 1편Python+numpy pandas 1편
Python+numpy pandas 1편Yong Joon Moon
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 Yong Joon Moon
 
Project#4상호참조 생성기 Hwp
Project#4상호참조 생성기 HwpProject#4상호참조 생성기 Hwp
Project#4상호참조 생성기 HwpKimjeongmoo
 
파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기Yong Joon Moon
 
Python array.array 모듈 이해하기
Python array.array 모듈 이해하기Python array.array 모듈 이해하기
Python array.array 모듈 이해하기Yong Joon Moon
 
Python+numpy pandas 3편
Python+numpy pandas 3편Python+numpy pandas 3편
Python+numpy pandas 3편Yong Joon Moon
 
파이썬 문자열 이해하기
파이썬 문자열 이해하기파이썬 문자열 이해하기
파이썬 문자열 이해하기Yong Joon Moon
 
파이썬 문자열 이해하기
파이썬 문자열 이해하기파이썬 문자열 이해하기
파이썬 문자열 이해하기Yong Joon Moon
 
파이썬정리 20160130
파이썬정리 20160130파이썬정리 20160130
파이썬정리 20160130Yong Joon Moon
 
Tensorflow
TensorflowTensorflow
Tensorflowchs71
 
2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)pchmago
 
파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기Yong Joon Moon
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815Yong Joon Moon
 
파이썬+정규표현식+이해하기 20160301
파이썬+정규표현식+이해하기 20160301파이썬+정규표현식+이해하기 20160301
파이썬+정규표현식+이해하기 20160301Yong Joon Moon
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7mil23
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfkd19h
 

What's hot (18)

강의자료3
강의자료3강의자료3
강의자료3
 
Python+numpy pandas 1편
Python+numpy pandas 1편Python+numpy pandas 1편
Python+numpy pandas 1편
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기
 
Project#4상호참조 생성기 Hwp
Project#4상호참조 생성기 HwpProject#4상호참조 생성기 Hwp
Project#4상호참조 생성기 Hwp
 
파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기
 
Python array.array 모듈 이해하기
Python array.array 모듈 이해하기Python array.array 모듈 이해하기
Python array.array 모듈 이해하기
 
Python+numpy pandas 3편
Python+numpy pandas 3편Python+numpy pandas 3편
Python+numpy pandas 3편
 
파이썬 문자열 이해하기
파이썬 문자열 이해하기파이썬 문자열 이해하기
파이썬 문자열 이해하기
 
파이썬 문자열 이해하기
파이썬 문자열 이해하기파이썬 문자열 이해하기
파이썬 문자열 이해하기
 
파이썬정리 20160130
파이썬정리 20160130파이썬정리 20160130
파이썬정리 20160130
 
Tensorflow
TensorflowTensorflow
Tensorflow
 
2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)
 
파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815
 
파이썬+정규표현식+이해하기 20160301
파이썬+정규표현식+이해하기 20160301파이썬+정규표현식+이해하기 20160301
파이썬+정규표현식+이해하기 20160301
 
선형 대수학
선형 대수학선형 대수학
선형 대수학
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 

Viewers also liked

Toss out that old stakeholder review proceess!
Toss out that old stakeholder review proceess!Toss out that old stakeholder review proceess!
Toss out that old stakeholder review proceess!Jill Christ
 
Video Marketing Project for ESL students
Video Marketing Project for ESL studentsVideo Marketing Project for ESL students
Video Marketing Project for ESL studentsDebbie Anholt
 
Daily Newsletter: 10th March, 2011
Daily Newsletter: 10th March, 2011Daily Newsletter: 10th March, 2011
Daily Newsletter: 10th March, 2011Fullerton Securities
 
Как UX-специалист делился своими инструментами с agile-командами
Как UX-специалист делился своими инструментами с agile-командамиКак UX-специалист делился своими инструментами с agile-командами
Как UX-специалист делился своими инструментами с agile-командамиNikita Efimov
 
La potestad tributaria
La potestad tributariaLa potestad tributaria
La potestad tributariaCésar Suárez
 
Ws phpl1 php_apps_basics_1.2
Ws phpl1 php_apps_basics_1.2Ws phpl1 php_apps_basics_1.2
Ws phpl1 php_apps_basics_1.2Kensaku Suzuki
 
The most common pitfalls metrics
The most common pitfalls metricsThe most common pitfalls metrics
The most common pitfalls metricsAKAMIS
 
Ibegoldex presentacion agosto 2015
Ibegoldex presentacion agosto 2015Ibegoldex presentacion agosto 2015
Ibegoldex presentacion agosto 2015Alexander Guzman
 
GFR CPE Trouble Shoot Guide (JP)
GFR CPE Trouble Shoot Guide (JP)GFR CPE Trouble Shoot Guide (JP)
GFR CPE Trouble Shoot Guide (JP)Takaaki Miki
 
Eval Presentationfinal
Eval PresentationfinalEval Presentationfinal
Eval Presentationfinalphilgheritage
 
Cosmetics & Toiletries & National Press
Cosmetics & Toiletries & National PressCosmetics & Toiletries & National Press
Cosmetics & Toiletries & National PressNewsworks
 
Responsive design and Drupal, case Costume.fi
Responsive design and Drupal, case Costume.fiResponsive design and Drupal, case Costume.fi
Responsive design and Drupal, case Costume.fiExove
 
サークル対抗テニス大会!
サークル対抗テニス大会!サークル対抗テニス大会!
サークル対抗テニス大会!stucon
 
Citrix enterprise mobility presentation bede hackney
Citrix enterprise mobility presentation bede hackneyCitrix enterprise mobility presentation bede hackney
Citrix enterprise mobility presentation bede hackneyGreythornAU
 
О проекте
О проектеО проекте
О проектеkulibin
 

Viewers also liked (16)

Toss out that old stakeholder review proceess!
Toss out that old stakeholder review proceess!Toss out that old stakeholder review proceess!
Toss out that old stakeholder review proceess!
 
Video Marketing Project for ESL students
Video Marketing Project for ESL studentsVideo Marketing Project for ESL students
Video Marketing Project for ESL students
 
Daily Newsletter: 10th March, 2011
Daily Newsletter: 10th March, 2011Daily Newsletter: 10th March, 2011
Daily Newsletter: 10th March, 2011
 
Как UX-специалист делился своими инструментами с agile-командами
Как UX-специалист делился своими инструментами с agile-командамиКак UX-специалист делился своими инструментами с agile-командами
Как UX-специалист делился своими инструментами с agile-командами
 
La potestad tributaria
La potestad tributariaLa potestad tributaria
La potestad tributaria
 
Ws phpl1 php_apps_basics_1.2
Ws phpl1 php_apps_basics_1.2Ws phpl1 php_apps_basics_1.2
Ws phpl1 php_apps_basics_1.2
 
The most common pitfalls metrics
The most common pitfalls metricsThe most common pitfalls metrics
The most common pitfalls metrics
 
Ibegoldex presentacion agosto 2015
Ibegoldex presentacion agosto 2015Ibegoldex presentacion agosto 2015
Ibegoldex presentacion agosto 2015
 
GFR CPE Trouble Shoot Guide (JP)
GFR CPE Trouble Shoot Guide (JP)GFR CPE Trouble Shoot Guide (JP)
GFR CPE Trouble Shoot Guide (JP)
 
Eval Presentationfinal
Eval PresentationfinalEval Presentationfinal
Eval Presentationfinal
 
Cosmetics & Toiletries & National Press
Cosmetics & Toiletries & National PressCosmetics & Toiletries & National Press
Cosmetics & Toiletries & National Press
 
Responsive design and Drupal, case Costume.fi
Responsive design and Drupal, case Costume.fiResponsive design and Drupal, case Costume.fi
Responsive design and Drupal, case Costume.fi
 
Flowers fuit
Flowers fuitFlowers fuit
Flowers fuit
 
サークル対抗テニス大会!
サークル対抗テニス大会!サークル対抗テニス大会!
サークル対抗テニス大会!
 
Citrix enterprise mobility presentation bede hackney
Citrix enterprise mobility presentation bede hackneyCitrix enterprise mobility presentation bede hackney
Citrix enterprise mobility presentation bede hackney
 
О проекте
О проектеО проекте
О проекте
 

Similar to 자료구조 트리 보고서

[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐S.O.P.T - Shout Our Passion Together
 
자료구조 Project4
자료구조 Project4자료구조 Project4
자료구조 Project4KoChungWook
 
자료구조 그래프 보고서
자료구조 그래프 보고서자료구조 그래프 보고서
자료구조 그래프 보고서mil23
 
자료구조 05 최종 보고서
자료구조 05 최종 보고서자료구조 05 최종 보고서
자료구조 05 최종 보고서pkok15
 
[Swift] Data Structure - Binary Tree
[Swift] Data Structure - Binary Tree[Swift] Data Structure - Binary Tree
[Swift] Data Structure - Binary TreeBill Kim
 
Project#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpProject#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpKimjeongmoo
 
CS Study - Data Structure 자료 구조. Tree 발표자료
CS Study - Data Structure 자료 구조. Tree 발표자료CS Study - Data Structure 자료 구조. Tree 발표자료
CS Study - Data Structure 자료 구조. Tree 발표자료Jiwoo Choi
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4KoChungWook
 
이산치수학 Project5
이산치수학 Project5이산치수학 Project5
이산치수학 Project5KoChungWook
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서KimChangHoen
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리S.O.P.T - Shout Our Passion Together
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfjinwookhong
 
Data Structure 2
Data Structure 2Data Structure 2
Data Structure 2yonsei
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서KimChangHoen
 

Similar to 자료구조 트리 보고서 (20)

[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
 
DS_04
DS_04DS_04
DS_04
 
자료구조 Project4
자료구조 Project4자료구조 Project4
자료구조 Project4
 
자료구조04
자료구조04자료구조04
자료구조04
 
자구4번
자구4번자구4번
자구4번
 
자료구조 그래프 보고서
자료구조 그래프 보고서자료구조 그래프 보고서
자료구조 그래프 보고서
 
자료구조 05 최종 보고서
자료구조 05 최종 보고서자료구조 05 최종 보고서
자료구조 05 최종 보고서
 
[Swift] Data Structure - Binary Tree
[Swift] Data Structure - Binary Tree[Swift] Data Structure - Binary Tree
[Swift] Data Structure - Binary Tree
 
Project#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpProject#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages Hwp
 
CS Study - Data Structure 자료 구조. Tree 발표자료
CS Study - Data Structure 자료 구조. Tree 발표자료CS Study - Data Structure 자료 구조. Tree 발표자료
CS Study - Data Structure 자료 구조. Tree 발표자료
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4
 
이산치수학 Project5
이산치수학 Project5이산치수학 Project5
이산치수학 Project5
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
2012 Ds 06
2012 Ds 062012 Ds 06
2012 Ds 06
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
 
자구2번
자구2번자구2번
자구2번
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
Data Structure 2
Data Structure 2Data Structure 2
Data Structure 2
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 

More from mil23

이산치수학 데이터베이스
이산치수학 데이터베이스이산치수학 데이터베이스
이산치수학 데이터베이스mil23
 
이산치보고서
이산치보고서이산치보고서
이산치보고서mil23
 
길찾기
길찾기길찾기
길찾기mil23
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3mil23
 
프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서mil23
 
파스칼삼각형
파스칼삼각형파스칼삼각형
파스칼삼각형mil23
 
보고서1
보고서1보고서1
보고서1mil23
 
말의여행
말의여행말의여행
말의여행mil23
 

More from mil23 (8)

이산치수학 데이터베이스
이산치수학 데이터베이스이산치수학 데이터베이스
이산치수학 데이터베이스
 
이산치보고서
이산치보고서이산치보고서
이산치보고서
 
길찾기
길찾기길찾기
길찾기
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3
 
프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서
 
파스칼삼각형
파스칼삼각형파스칼삼각형
파스칼삼각형
 
보고서1
보고서1보고서1
보고서1
 
말의여행
말의여행말의여행
말의여행
 

자료구조 트리 보고서

  • 1. C3조 과제물 발표 조장 : 09박구남 조원 : 07이용재 09김현호 09송하윤 11정예린 - 1 -
  • 2. 과제수행일지 조원소개 C3 조 조장 박구남 소 속 자료조사 송하윤, 김현호 프로그래밍 이용재, 정예린 주 제 연구제목 상호 참조 생성기 트리를 이용하여 하나 이상의 문장을 입력 하였을때 단어들의 개수,Line를 나타낼 수 있 연구배경 으며 이것을 응용 할 수 있다. 참 고 자 료 과제의 수행 첫째날 2012 년 5 월 8 일 화요일 회의 주제 조원 자기소개 및 역할분담, 과제 파악 조장 : 박구남 자료조사 : 김현호, 송하윤 프로그래밍 : 이용재, 정예린 이상과 같이 이번 프로젝트의 역할분담을 실시했습니다. 첫 수업시간에 문제 파악을 위해 토의를 진행 하면서 각자 역할 분담을 하였습니다. 트리(Tree) 트리(Tree) 트리 회로. 나무가 하나의 뿌리(Root)에서 줄기가 나와 가지로 나누어지는 것처럼, 어떤 회의 내용 하나의 집합으로부터 하위 레벨로 가지가 나오는 집합 관계를 갖는 계층 구조를 말한다. 부분적으로도 결코 루트를 형성하는 경우는 없다. 따라서 처음에 가지가 나오기 시작되 고 있는 집합으로부터 차례대로 가지 를 더듬어가면 목적의 집합을 찾을 수 있다. 정 보 처리 분야에는 이 같은 트리 구조를 가진 개념이 많이 있다. 트리의 조건 1) 트리의 노드 중 1개의 Root Node가 있어야 한다. 2) Root Node를 제외한 노드들을 n개 (n>=0)의 부분집합으로 나누어지며, 각 부분집합 은 하나의 트리이다. 이때 각 부분집합을 subtree라고 한다.
  • 3. 용어. 트리의 용어. Node 트리를 표현하는 구성요소. Root Node 트리에서 최상위 레벨에 있는 노드(트리의 처음 노드). Degree of Node 노드에서 children Node의 수. Degree of a Tree 트리를 형성하는 모든 노드의 차수에서 최대값. Sub tree 트리에서 Root Node를 제외한 모든 트리. Ancestor Node Root Node에서 임의의 노드 까지의 경로를 형성하는 노드. Descendent Node 트리에서 임의의 하위노드에 연결된 모든 노드. Parent Node 임의의 노드에 연결된 바로 위의 노드. Children Node 임의에 노드에 연결된 바로 아래의 노드. sibling 동일한 Parent Node를 가지는 노드. Branch Node Root Node와 Leaf Node를 제외한 모든 노드. Leaf Node 노드의 차수가 0인 노드(트리의 마지막노드). Level 트리에서 Root Node부터 한단계씩 내려가면서 1씩 증가한다. Height(Depth) 트리의 최대 레벨. Path 어떤 임의의 노드로부터 임의의 노드에 이르는 동안에 연결된 일련의 노드의 집합. 경 로의 길이는 경로를 구성하는 노드의 수보다 1이 작다. 표현방법. 트리의 표현방법. 트리의 표현방법으로는 리스트, 집합, 막대 그래프, 배열, 연결리스트 등이 있다. 방법. 트리의 분류 방법 - 2 -
  • 4. 트리는 그래프의 일종으로서 Direct Tree 와 Undirect Tree, General Tree와 Binary Tree 등으로 구분된다. General Tree. 1)Ordered Tree & Oriented Tree 트리에서 레벨의 같은 노드들의 순서가 중요한 경우를 Ordered Tree라고 하고, 노드의 순서가 중요하지 않은 경우에는 Oriented Tree라고 한다. 2)Similar Tree & Equivalent Tree 임의의 트리가 2개 주어졌을때 트리를 구성하는 전체 노드의 수와 좌우 배열 위치등과 같은 외형적인 부분이 같을 경우 Similar Tree 라고 하고, 노드의 내용까지 같은 경우 Equivalent Tree라고 한다. Binary Tree 일반트리와는 다르게 중요한 형태의 자료 객체로 차수가 2이하인 트리이다. 즉, 일반트 리에서는 노드의 공백이 존재할 수 없지만, Binary Tree에서는 존재 가능하며, 왼쪽과 오른쪽 SubTree가 독립적이다. 1) Full Binary Tree Depth가 i인 Binary Tree에서 연결될 수 있는 최대의 노드가 연결되어진 트리를 말하 며 노드의 수는 2i-1개이다. 2) Complete Binary Tree level이 i인 노드의 수를 n이라 할 때 2^i-1 -1<n<2^i -1을 만족하는 트리. 3)Knuth Binary Tree 각 노드의 차수가 2이하인 트리. 4)사향이진트리 Root Node를 중심으로 왼쪽이나 오른쪽 한 방향으로 기울어진 트리. zz 조원들 모두 기본적인 트리의 형태만 알고 있었으며, 트리의 종류,표현방법,프로그래밍에 응용 하는 방법은 모두 알지 못하여 자료조사를 하며 알아보기로 토의 하였습니다. 반성 둘째날 2012 년 5 월 10 일 목요일 회의주제 AVL트리의 균형방법 및 정의 서로가 조사해온 내용을 바탕으로 알고리즘을 만들기에 앞서 균형트리에 관하여 교수님 께 AVL 트리 AVL 트리는 Adelson-Velskii와 Landis에 의해 1962년에 제안된 트리로써 각 노들에 왼 쪽 서브 트리의 높이와 오른쪽 서브트리의 높이 차잉가 1 이하인 이진 탐색 트리를 말한 다. AVL트리는 트리가 비균형 상태로 되면 스스로 노드들을 재배치하여 균형 상태로 만 회의내용 든다. 따라서 AVL 트리는 균형 트리가 항상 보장되기 때문에 탐색시간이 O(logn) 시간 안에 끝나게 된다. 또한 삽입과 삭제 연산도 O(logn) 시간 안에 할 수 있다. 하지만 레드 -블랙 트리보다 효율이 떨어지기 때문에 자주 사용되지는 않는다. AVL 트리에서 균형 인수는 매우 중요하다. 균형 인수(Balancing Factor)란 [왼쪽 서브 트리의 높이 - 오른쪽 서브 트리의 높이]로 정의 된다. 모든 노드의 균형 인수가 1 이 하이면 AVL 트리이다. 아래의 사진은 모든 균형 인수가 적절하기 때문에 AVL 트리라고 할 수 있다. - 3 -
  • 5. 삽입 연산 원소를 하나 삽입하게 된다면 이진 탐색 트리의 삽입 규칙에 따라 우선 노드를 위치시킨 다. 그리고 모든 노드에 대한 균형인수가 1 내에 값이면 균형이 유지된 것이므로 삽입 과정을 마친다. 하지만 모든 노드 중 한 노드의 균형 인수만이라도 그 범위를 벗어나면 균형을 맞춰주기 위한 "회전(Rotation)" 작업을 해주어야 한다. AVL 트리에서 균형이 깨지는 타입은 4가지가 있다. 각각의 타입을 살펴보도록 하자. 새 로 추가되는 노드를 N, 가장 가까우면서 균형인수가 2가 된 조상 노드를 A라고 하자. - LL : N이 A의 왼쪽 서브트리의 왼쪽에 삽입되는 경우 - LR : N이 A의 왼쪽 서브트리의 오른쪽에 삽입되는 경우 - RR : N이 A의 오른쪽 서브트리의 오른쪽에 삽입되는 경우 - RL : N이 A의 오른쪽 서브트리의 왼쪽에 삽입되는 경우 [LL] [LR] 이렇게 균형이 깨지는 경우에서 균형 트리로 다시 변경하기 위해서 수행하는 회전 또한 각각 다르다. - LL : A부터 N까지의 경로 상의 노드들을 오른쪽으로 회전시킨다.(단순회전) - LR : A부터 N까지의 경로 상의 노드들을 왼쪽-오른쪽으로 회전시킨다.(이중회전) - RR : A부터 N까지의 경로 상의 노드들을 왼쪽으로 회전시킨다.(단순회전) - RL : A부터 N까지의 경로 상의 노드들을 오른쪽-왼쪽으로 회전시킨다.(이중회전) LL과 RR 회전, LR과 RL 회전이 각각 대칭적으로 동작하게 된다. LL 부터 설명하자면, 일단 바로 위 그림을 보자. 세개의 원소를 정확하게 재배치하기 위 해선 세개 중 중간값을 부모에 위치시키고 나머지를 각각 왼쪽, 오른쪽 자식으로 삼으면 될 것이다. 따라서 A가 부모가 되고 B는 A의 왼쪽 자식 노드 위치를 고수하며, C는 A의 - 4 -
  • 6. 오른쪽 자식 노드가 된다. A의 오른쪽 자식 노드는 C의 왼쪽 자식 노드가 된다. 다음으로 LR 을 보자. 먼저 A가 B의 자리에 위치하고 B는 A의 왼쪽 자식 노드가 된다. A의 기존 왼쪽 자식 노드는 B의 오른쪽 자식 노드가 된다. 이렇게 첫번째 회전이 완료되 고 두번째 회전은 LL과 동일하다. 회전에 대한 습득은 글로만 읽어서는 절대 익힐 수 없으니, 다른 책을 보면서 실제로 수 행하보길 바란다. 위 그림의 경우보다 복잡한 경우(균형 인수가 4인 경우도 볼 수 있다) 도 많으니 연습이 필수적이다. [출처] 균형 이진 탐색 트리 - AVL 트리, 레드-블랙 트리| 출처] -균형트리(AVL)에 관하여 내용을 이해 할 수 있었으나 이것을 코딩에 적용 하는것이 쉽지않았음. 문제점 셋째날 2012 년 5 월 15 일 화요일 회의주제 프로그램 초안 분석 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <string.h> struct Node { char name; Node *link[26]; int page[26]; int count; int spot; }; Node addtree (Node *A, Node *B); Node AddNode (char A); Node Delnode (Node *A, char B); int search (Node *A, char B); int searchspot (Node *A, char B); void Printans (Node *A, char ans[], int x); int main () { int i,j,x,z; int check=0; FILE *point; char a = 'R'; int m=0; 프로그램 초안 printf("진행중 진행중"); // printf("진행중"); Node *tree = (Node *)malloc(sizeof(Node)); printf("진행중 진행중"); // printf("진행중"); point=fopen("C://file.txt","r"); if(point==NULL) { return 1; } i = 0; j = 1; z = 0; tree[i] = AddNode(a); //텍스트 저장. while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. { a=fgetc(point); if(a>=65 && a<=90) { a+=32; } if(a>=97 && a<=122) // 알파벳이면 노드 진행 {printf("%c",a); check = search(&tree[i],a); // 노드 있는지 확인 이동. if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동. - 5 -
  • 7. tree[j] = AddNode(a); tree[j].spot = j; tree[i] = addtree(&tree[i],&tree[j]); i = j; j++; } else { i = searchspot(&tree[i],a); 이동. } // 노드가 있으면 그대로 위치만 이동. } else if(a==' ' || a=='n') { 일시, 증가. root로 복귀. // 공백이나 n 일시, 카운터 증가. 그리고 root로 복귀. tree[i].count++; tree[i].page[z]=1; i = 0; } else if(a=='+') { z++; } else if(a==EOF) {break; // 아무 것도 없을 시 종료 } } fclose(point); char ANS[50] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; printf("nWord Count Linesn"); Printans(&tree[0],ANS,0); // 출력 system("PAUSE"); getch(); return 0; } Node addtree (Node *A, Node *B) { for (int i = 0; i < 26 ; i++) { if (A->link[i] == NULL) { A -> link[i] = B; printf("%c의 LINK%d에 %c를 printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name); break; } } return *A; } Node AddNode (char A) { Node *B = (Node *)malloc(sizeof(Node)); B->name = A; for (int i = 0; i < 26 ; i++) { B->link[i] = NULL; B->page[i] = 0; } B->count = 0; B -> spot = 0; return *B; } Node Delnode (Node *A, char B) { for (int i = 0; i < 26 ; i++) { - 6 -
  • 8. if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { A -> link[i] = NULL; printf("%c에 LINK&d에 %c를 printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); } } } return *A; } int search (Node *A, char B) { int x = 0; int i; for (i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { x = 1; break; } } else break; } return x; } int searchspot (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) {return A -> link[i] -> spot;} } } return 0; } void Printans (Node *A, char ans[], int x) { ans[x] = A -> name; for (int i = 0 ; i < 26 ; i++) { if (A -> count != 0) { for (int j=0; j<=x; j++) { printf("%c %d", ans[j],A->count); } for (int j=0; j<=26; j++) { if (A->page[j] == 1) { printf("%d",j+1); } } } else {} if (A->link[i] != NULL) { Printans( A->link[i],ans,x); } else {} } return; } // 출력 프로그램 초안을 분석하여 프로그램 실행이 되기위하여 어떤식으로 바꿔보면 좋을지 조원들과 토의를 진행 하였음. 회의내용 문제점 프로그램 초안 분석을 한 결과 오류가 발생 하였는데 무엇 때문에 오류가 발생 하였는지 - 7 -
  • 9. 찾지를 못하여 헤매었음. 주위 지인의 도움을 받아 문제점을 찾아 보려고 하였으나, 찾지 못하여 문자열을 배열에 옮겨서 풀어보기로 하였음. 넷째날 2012 년 5 월 17 일 목요일 회의주제 프로그램 보완 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <string.h> struct Node { char name; Node *link[26]; int page[26]; int count; int spot; }; Node addtree (Node *A, Node *B); Node AddNode (char A); Node Delnode (Node *A, char B); int Search (Node *A, char B); int Searchspot (Node *A, char B); void Printans (Node *A, char ans[], int x); int main () { int i,j,x,z; int check=0; FILE *point; char arr[100]; int a; int m=0; int Sizec; printf("진행중 진행중"); // printf("진행중"); Node *tree = (Node *)malloc(sizeof(Node)); printf("진행중 진행중"); // printf("진행중"); point=fopen("D://file.txt","r"); 프로그램 if(point==NULL) { 수정안 return 1; } //텍스트 while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. 저장. { a=fgetc(point); if((a>=65 && a<=90) || (a>=97 && a<=122)) { arr[m]=a; if(a==EOF) { break; } else { m++; } } else if(a==' ' || a=='n') { arr[m]=' '; if(a==EOF) { break; } else { m++; } } else { if(a==EOF) { break; } } } fclose(point); //배열에 저장. for(i=0;i<m;i++) //배열에 저장된 문자들을 소문자로 변환하여 다시 배열에 저장. - 8 -
  • 10. { if(arr[i]>=65 && arr[i]<=90) { arr[i]=arr[i]+32; } printf("%c",arr[i]); } fclose(point); printf("n"); Sizec = m; i = 0; j = 1; z = 2; m = 0; tree[i] = AddNode('R'); {//텍스트 저장. for(;;) {//텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. if(arr[m]>='a' && arr[m]<='z') {// 알파벳이면 노드 진행 printf("%cn",arr[m]); check = Search(&tree[i],arr[m]); // 노드 있는지 확인 if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동. 이동. tree[j] = AddNode(arr[m]); j;//노드 tree[j].spot = j;//노드 위치를 저장. 저장. tree[i] = addtree(&tree[i],&tree[j]); i = j; // i는 진행 노드 j++; // 노드 생성 위치 } else { i = Searchspot(&tree[i],arr[m]); printf("%d - %cn",i,tree[i].name); } // 노드가 있으면 그대로 위치만 이동. 이동. } else if(arr[m]==' ' || arr[m]=='n') { 일시, 증가. // 공백이나 n 일시, 카운터 증가. root로 복귀. 그리고 root로 복귀. tree[i].count++; // 단어 갯수 표기 tree[i].page[z]=1; // 등장 페이지 표기 i = 0; 정의함. } else if(arr[m]=='.') {// 임의로 다음페이지를 나타내는 기호를 + 로 정의함. z++; } else if(arr[m]==EOF) {break; // 아무 것도 없을 시 종료 } if (Sizec < m) break; m++; } char ANS[50] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // 영단어 최 1000자가 장 길이 단어는 1000자가 넘어가지만 일반적으로 50자 미만. 50자 미만. printf("nWord Count Linesn"); Printans(&tree[0],ANS,0); // 출력 system("PAUSE"); getch(); return 0; } Node addtree (Node *A, Node *B) { for (int i = 0; i < 26 ; i++) { if (A->link[i] == NULL) { A -> link[i] = B; printf("%c의 LINK%d에 %c를 printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name); break; } else {} } return *A; - 9 -
  • 11. } Node AddNode (char A) { Node *B = (Node *)malloc(sizeof(Node)); B->name = A; for (int i = 0; i < 26 ; i++) { B->link[i] = NULL; B->page[i] = 0; } B->count = 0; B -> spot = 0; return *B; } Node Delnode (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { A -> link[i] = NULL; printf("%c에 LINK&d에 %c를 printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); } } } return *A; } int Search (Node *A, char B) { int x = 0; int i; for (i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { x = 1; break; } } else {break;} } return x; } int Searchspot (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) {return A -> link[i] -> spot;} } } return 0; } void Printans (Node *A, char ans[], int x) { ans[x] = A -> name; int i; int j; - 10 -
  • 12. if (A -> count != 0) { printf("단어 printf("단어 : "); for (j=0; j<=x; j++) { printf("%c", ans[j]); } // printf("%c", A->name); printf("등장 printf("등장 횟수 : "); printf("%d",A->count); printf("등장 printf("등장 페이지 : "); for (j=0; j<26; j++) { if (A ->page[j] == 1) { printf("%d n",j+1); } } } for (i = 0 ; i < 26 ; i++) { if (A->link[i] != NULL) { if (A -> spot != 0) x+=1; Printans( A->link[i],ans,x); } else {} } return; } // 출력 초안 소스에서 오류가 발생하였는데 오류를 찾지 못하여 문자열을 배열에 옮겨풀어보기 로 하여 분리 시켜보기로 하였음. 회의내용 문자열을 배열에 옮겨 풀어 본 후 else구문을 if 구문으로 바꾼후 실행하니 오류는 발생 문제점 하지 않았음. 그러나 6글자를 넘어서 입력 될 경우 오류가발생됨. 오류를 찾으려 하였으나 찾지 못하였음. 결과 발표 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <string.h> struct Node { char name; Node *link[26]; int page[26]; int count; int spot; }; Node addtree (Node *A, Node *B); Node AddNode (char A); Node Delnode (Node *A, char B); int Search (Node *A, char B); int Searchspot (Node *A, char B); 프로그램 소스 void Printans (Node *A, char ans[], int x); int main () { int i,j,x,z; int check=0; FILE *point; char arr[100]; int a; int m=0; int Sizec; printf("진행중 진행중"); // printf("진행중"); Node *tree = (Node *)malloc(sizeof(Node)); printf("진행중 진행중"); // printf("진행중"); point=fopen("C://file.txt","r"); if(point==NULL) { - 11 -
  • 13. return 1; } //텍스트 while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. 저장. { a=fgetc(point); if((a>=65 && a<=90) || (a>=97 && a<=122) || (a == '+')) { arr[m]=a; if(a==EOF) { break; } else { m++; } } else if(a==' ' || a=='n') { arr[m]=' '; if(a==EOF) { break; } else { m++; } } else { if(a==EOF) { break; } } } fclose(point); //배열에 저장. for(i=0;i<m;i++) //배열에 저장된 문자들을 소문자로 변환하여 다시 배열에 저장. { if(arr[i]>=65 && arr[i]<=90) { arr[i]=arr[i]+32; } printf("%c",arr[i]); } fclose(point); printf("n"); Sizec = m; i = 0; j = 1; z = 0; m = 0; tree[i] = AddNode('R'); {//텍스트 저장. for(;;) {//텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. if(arr[m]>='a' && arr[m]<='z') {// 알파벳이면 노드 진행 // printf("%cn",arr[m]); check = Search(&tree[i],arr[m]); // 노드 있는지 확인 if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동. 이동. tree[j] = AddNode(arr[m]); j;//노드 tree[j].spot = j;//노드 위치를 저장. 저장. tree[i] = addtree(&tree[i],&tree[j]); i = j; // i는 진행 노드 j++; // 노드 생성 위치 } else { i = Searchspot(&tree[i],arr[m]); printf("%c가 내려갑니다.n",tree[i].name); printf("%c가 존재하여 내려갑니다.n",tree[i].name); } // 노드가 있으면 그대로 위치만 이동. 이동. } if(arr[m]==' ' || arr[m]=='n') { 일시, 증가. // 공백이나 n 일시, 카운터 증가. 그리고 root로 복귀. root로 복귀. tree[i].count++; // 단어 갯수 표기 tree[i].page[z]=1; // 등장 페이지 표기 i = 0; } 정의함. if(arr[m]=='+') {// 임의로 다음페이지를 나타내는 기호를 + 로 정의함. z++; - 12 -
  • 14. } if(arr[m]==EOF) {break; // 아무 것도 없을 시 종료 } if (Sizec < m) break; m++; } char ANS[50] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // 영단어 최 1000자가 장 길이 단어는 1000자가 넘어가지만 일반적으로 50자 미만. 50자 미만. printf("nWord Count Linesn"); Printans(&tree[0],ANS,0); // 출력 system("PAUSE"); getch(); return 0; } Node addtree (Node *A, Node *B) { for (int i = 0; i < 26 ; i++) { if (A->link[i] == NULL) { A -> link[i] = B; printf("%c의 LINK%d에 %c를 printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name); break; } else {} } return *A; } Node AddNode (char A) { Node *B = (Node *)malloc(sizeof(Node)); B->name = A; for (int i = 0; i < 26 ; i++) { B->link[i] = NULL; B->page[i] = 0; } B->count = 0; B -> spot = 0; return *B; } Node Delnode (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { A -> link[i] = NULL; printf("%c에 LINK&d에 %c를 printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); } } } return *A; } int Search (Node *A, char B) { int x = 0; int i; for (i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { x = 1; break; } - 13 -
  • 15. } else {break;} } return x; } int Searchspot (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) {return A -> link[i] -> spot;} } } return 0; } void Printans (Node *A, char ans[], int x) { ans[x] = A -> name; int i; int j; if (A -> count != 0 && A -> name != 'R' ) { printf("단어 printf("단어 : "); for (j=0; j<=x; j++) { printf("%c", ans[j]); } // printf("%c", A->name); printf("등장 printf("등장 횟수 : "); printf("%d",A->count); printf("등장 printf("등장 페이지 : "); for (j=0; j<26; j++) { if (A ->page[j] == 1) { printf("%d n",j+1); } } } for (i = 0 ; i < 26 ; i++) { if (A->link[i] != NULL) { if (A -> spot != 0) x+=1; Printans( A->link[i],ans,x); } else {} } return; } // 출력 문제화면 - 14 -
  • 16. 맨위 노드는 비움 space 부분을 기준으로 단어를 떼어내고 맨 앞 글자를 2level 노드에 넣는다. 알고리즘 개요 맨앞 글자가 같을 경우 그다음 하위 레벨에 다음 문자를 넣는다. 없을 경우 단어를 순서대로 한 문자씩 넣는다. 두 개의 트리(1line,2line)를 만들고 비교하여 노드를 비교 하여 출력한다 문자 입력이 6개 이상 들어가면 오류가 발생. 입력 양식은 +가 페이지 구분선이고 마지막에 띄워쓰기나 엔터를 하여야 종료. 균형트리의 구현과정에서 구현을 하기가 어려워서 배열로 받아서 처리하는 방식으로 사 최종 반성 용 하였습니다. - 15 -