C언어 응용 제10주 실습 해보기 제8장 트리
실습 내용 예제 8-1 이진트리 순회 프로그램 예제 8-2 가상폴더의 용량 계산 프로그램 예제 8-3 이진탐색트리의 연산 프로그램 예제 8-4 순차자료구조를 이용한 최대히프 프로 그램
예제 8-1 실습하기 연결자료구조를 이용한 이진트리 구현 이진트리 노드 생성 함수 작성 이진트리의 순회 함수 작성 이진트리를 구현한 소스파일과 헤더파일을 따로 작성한다. 구현한 함수 목록 makeBinaryTree : 이진트리 노드를 생성하는 함수 preorder : 전위 순회 함수 inorder : 전위 순회 함수 postorder : 전위 순회 함수 removeBinaryTree : 이진트리 삭제
소스 목록 및 내용 binarytree.h : 이진트리구현에 필요한 자료형과 함수의 원형을 선언하는 헤더 파일 binarytree.c : 이진트리구현에 필요한 함수의 내 용을 작성한 소스 ex0801.c : 이진트리를 테스트하는 main 소스 파 일
실습하는 순서 Eclipse 를 실행한다. Workspace와 Perspective가 맞는지 확인 하고 맞지 않으면 수정한다. Workspace 는 D:\Lec_hwlee\Capp\y2014 이고 Perspective 는 C/C++ 이어야 한다. 프로젝트 생성 binarytree.h 파일 작성 binarytree.c 파일 작성 ex0801.c 작성 빌드 및 실행 결과 확인
소스들 사이의 연관 관계 binarytree.h ex0801.c 이진트리 구현에 필요한 구조체와 필요한 함수의 원형을 선언한다. ex0801.c 구현된 연결리스트를 테스트 해보는 main 소스 포함한다. 포함한다. 실제 함수를 호출하여 사용한다. binarytree.c 이진트리 구현에 필요한 함수의 내용을 작성한다.
main 소스 코드 이진트리를 만들고 각 순회 방법으로 출력한다.
Eclipse 실행 D:\Lec_hwl\CApp\y2014
Eclipse 실행
Workspace 확인 D:\Lec_hwl\CApp\y2014
CDT Perspective 확인 이 버튼을 클릭해서 수정 Java EE 로 되어 있음
CDT Perspective 확인 C/C++ 선택
CDT Perspective 확인 C/C++ 로 되어 있음
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
프로젝트 명 설정 Ch0801 Empty Project Cygwin GCC D:\Lec_hwl\capp\y2014\Ch0801
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
생성된 빈 프로젝트 본인 컴퓨터의 사양에 따라 내용은 약간씩 다를 수 있음
binarytree.h 추가 및 작성 Header File 선택
binarytree.h 추가 및 작성 Ch0801 프로젝트명 설정(자동설정) binarytree.h 헤더 파일 명 설정
binarytree.h 추가 및 작성 자동 생성된 빈 헤더 파일 헤더가 여러 소스에서 포함되었을 때 이중으로 포함되지 않도록 하는 매크로 실제 헤더의 내용이 들어갈 위치
binarytree.h 추가 및 작성 노드 구조체 및 함수 원형 선언
binarytree.c 추가 및 작성 Source File 선택
binarytree.c 추가 및 작성 Ch0801 프로젝트명 확인 binarytree.c 소스 파일명 설정
binarytree.c 추가 및 작성 자동 생성된 빈 소스 파일
binarytree.c 추가 및 작성 필요한 코드 작성(빈 함수 작성) 표준 입출력 함수 헤더 메모리 할당 함수 헤더 이진트리관련 함수 헤더 필요한 각 함수의 원형에 맞게 함수의 몸체를 작성하되, 내용은 모두 빈 것으로 작성한다. 차후에 한 함수씩 코드의 내용을 작성한다.
makeTreeNode() 함수 노드에 저장할 자료와 왼쪽, 오른쪽 연결 노드를 이용하여 새로운 이진트리를 구성한다.
preorder() 함수 이진 트리를 전위 순회 한다.
inorder() 함수 이진 트리를 중위 순회 한다.
postorder() 함수 이진 트리를 후위 순회 한다.
removeBinaryTree() 함수 이진 트리가 사용하는 메모리를 반환한다.
ex0801.c 추가 및 작성 Source File 선택
ex0801.c 추가 및 작성 Ch0801 프로젝트명 확인 ex0801.c 소스 파일명 설정
추가된 빈 소스 파일 프로젝트에 3 개의 파일 ex0801.c, binarytree.c, binarytree.h 가 추가된 것을 확인할 수 있다.
main 함수 작성 빈 main 함수 작성 표준 입출력 함수 헤더 메모리 관련 함수 헤더 이진트리 관련 함수 헤더
main 함수 아래 그림과 같은 이진 트리를 만들고 전위, 중위, 후위 순회 출력을 한다.
main 함수 작성
main 함수 작성
빌드 및 실행 결과
도전 문제 트리의 자료를 정수로 하는 이진트리를 만들고 앞 예제의 A=5, B=-3, C=7, D=2 로 한 수식의 결 과를 계산하는 프로그램을 완성하시오.
예제 8-2 실습하기 이진트리 형태로 구성된 폴더 구조를 구현하고 폴 더의 총 크기를 계산한다. 이진트리를 구현한 소스파일과 헤더파일을 따로 작성한다. 구현한 함수 목록 makeFolderTree : 이진트리 폴더 구조를 생성한다. removeFolderTree : 이진트리가 사용하는 메모리를 반 환한다. postorderSize : 후위 순회로 폴더의 크기를 계산한다.
소스 목록 및 내용 foldertree.h : 필요한 자료형과 함수의 원형을 선 언하는 헤더 파일 foldertree.c : 필요한 자료형과 함수의 내용을 작 성한 소스 ex0802.c : 테스트하는 main 소스 파일
예제 폴더 구조
실습하는 순서 Eclipse 를 실행한다. Workspace와 Perspective가 맞는지 확인 하고 맞지 않으면 수정한다. Workspace 는 D:\Lec_hwlee\Capp\y2014 이고 Perspective 는 C/C++ 이어야 한다. 프로젝트 생성 foldertree.h 파일 작성 foldertree.c 파일 작성 ex0802.c 작성 빌드 및 실행 결과 확인
소스들 사이의 연관 관계 foldertree.h ex0802.c 이진트리 구현에 필요한 구조체와 필요한 함수의 원형을 선언한다. ex0802.c 구현된 연결리스트를 테스트 해보는 main 소스 포함한다. 포함한다. 실제 함수를 호출하여 사용한다. foldertree.c 이진트리 구현에 필요한 함수의 내용을 작성한다.
함수 가상 코드 makeFolderTree(data, left, right) s ← memory allocate for FolderTree; if ( s = NULL) then memory full error; return NULL; else { s-> data ← data; s-> left ← left; s-> right ← right; return s; } End makeFolderTree
함수 가상 코드 removeFolderTree(FolderTree * root) if ( root = NULL) then return; else { removeFolderTree(root->left); removeFolderTree(root->right); free root; } End removeFolderTree
함수 가상 코드 postorderSize(FolderTree * root) if( root = NULL) then return 0; else { size ← 0; size ← size + postorderSize(root->left); size ← size + postorderSize(root->right); size ← size + root->size; return size; } End postorderSize
main 소스 코드 앞의 그림과 같은 구조를 갖는 이진 트리를 만든다. 전체 폴더의 크기를 구하여 출력한다.
Eclipse 실행 D:\Lec_hwl\CApp\y2014
Eclipse 실행
Workspace 확인 D:\Lec_hwl\CApp\y2014
CDT Perspective 확인 이 버튼을 클릭해서 수정 Java EE 로 되어 있음
CDT Perspective 확인 C/C++ 선택
CDT Perspective 확인 C/C++ 로 되어 있음
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
프로젝트 명 설정 Ch0802 Empty Project Cygwin GCC D:\Lec_hwl\capp\y2014\Ch0802
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
생성된 빈 프로젝트 본인 컴퓨터의 사양에 따라 내용은 약간씩 다를 수 있음
foldertree.h 추가 및 작성 Header File 선택
foldertree.h 추가 및 작성 Ch0802 프로젝트명 설정(자동설정) foldertree.h 헤더 파일 명 설정
foldertree.h 추가 및 작성 자동 생성된 빈 헤더 파일 헤더가 여러 소스에서 포함되었을 때 이중으로 포함되지 않도록 하는 매크로 실제 헤더의 내용이 들어갈 위치
foldertree.h 추가 및 작성 노드 구조체 및 함수 원형 선언
foldertree.c 추가 및 작성 Source File 선택
foldertree.c 추가 및 작성 Ch0802 프로젝트명 확인 foldertree.c 소스 파일명 설정
foldertree.c 추가 및 작성 자동 생성된 빈 소스 파일
foldertree.c 추가 및 작성 필요한 코드 작성(빈 함수 작성) 표준 입출력 함수 헤더 메모리 할당 함수 헤더 이진트리관련 함수 헤더 필요한 각 함수의 원형에 맞게 함수의 몸체를 작성하되, 내용은 모두 빈 것으로 작성한다. 차후에 한 함수씩 코드의 내용을 작성한다.
makeFolderTree() 함수 노드에 저장할 자료와 왼쪽, 오른쪽 연결 노드를 이용하여 새로운 이진트리를 구성한다.
removeFolderTree() 함수 이진 트리가 사용하는 메모리를 반환한다.
preorderSize() 함수 이진 트리를 전위 순회하면서 크기를 계산한다.
ex0802.c 추가 및 작성 Source File 선택
ex0802.c 추가 및 작성 Ch0802 프로젝트명 확인 ex0802.c 소스 파일명 설정
추가된 빈 소스 파일 프로젝트에 3 개의 파일 ex0802.c, foldertree.c, foldertree.h 가 추가된 것을 확인할 수 있다.
main 함수 작성 빈 main 함수 작성 표준 입출력 함수 헤더 메모리 관련 함수 헤더 이진트리 관련 함수 헤더
main 함수 아래 그림과 같은 이진 트리를 만들고 후위순회를 사용하여 전체 크기를 계산하여 출력한다.
main 함수 작성
빌드 및 실행 결과
도전 문제 위 예제에서 노드의 자료에 폴더의 이름을 저장할 수 있도록 수정하고 출력할 때 노드에 저장된 이름 을 사용하도록 하시오.
예제 8-3 실습하기 이진탐색트리를 구현한다. 이진탐색트리를 사용하여 자료를 입력하고 검색하 는 프로그램을 구현한다. 구현한 함수 목록 insertNode : 이진탐색트리에 자료를 삽입한다. removeNode : 이진탐색트리로 부터 주어진 원소를 찾아 서 삭제한다. searchNode : 이진탐색트리에서 주어진 원소를 갖는 노 드를 찾는다. clearTree : 트리가 사용한 메모리를 반환한다. displayInorder : 이진탐색트리를 출력한다. menu : 메뉴를 출력하는 함수
소스 목록 및 내용 bst.h : 필요한 자료형과 함수의 원형을 선언하는 헤더 파일 bst.c : 필요한 자료형과 함수의 내용을 작성한 소 스 ex0803.c : 테스트하는 main 소스 파일
실습하는 순서 Eclipse 를 실행한다. Workspace와 Perspective가 맞는지 확인 하고 맞지 않으면 수정한다. Workspace 는 D:\Lec_hwlee\Capp\y2014 이고 Perspective 는 C/C++ 이어야 한다. 프로젝트 생성 bst.h 파일 작성 bst.c 파일 작성 ex0803.c 작성 빌드 및 실행 결과 확인
소스들 사이의 연관 관계 bst.h ex0803.c 이진탐색트리 구현에 필요한 구조체와 필요한 함수의 원형을 선언한다. 구현된 연결리스트를 테스트 해보는 main 소스 포함한다. 포함한다. 실제 함수를 호출하여 사용한다. bst.c 이진탐색트리 구현에 필요한 함수의 내용을 작성한다.
함수 가상 코드 insertNode(BSTNode *root, char data) p ← root; while ( p ≠ NULL) do { if( data = p.key) then return; q ← p; if( data < p.key) then p ← p.left; else p ← p.right; } node ← allocate memory for a new node; node.key ← data; node.left ← NULL; node.right ← NULL; if( root = NULL) root ← node; else if ( data < q.key) then q.left ← node; else q.right ← node; return root; End insertNode
함수 가상 코드 removeNode(BSTNode * root, char data) search node with the same key value; if not exist write message and return; remove that node and modify tree End removeNode
함수 가상 코드 searchNode(BSTNode * root, char data, BSTNode **parent) p ← root; if( p = NULL) then return NULL; if (p.key = data) then return p; if( data < p.key) then *parent ← p; return searchNode(p.left, data, parent); else return searchNode(p.right, data, parent); End searchNode
함수 가상 코드 clearTree(BSTNode * root) if( root ≠ NULL) then clearTree(root->left); clearTree(root->right); free(root); End clearTree
함수 가상 코드 displayInorder(BSTNode * root) if( root ≠ NULL) then displayInorder(root->left); printf(“%c_”, root->key); displayInorder(root->right); End displayInorder
main 소스 코드 이진탐색트리를 만들고 메뉴를 이용하여 삽입/삭 제/출력를 한다.
Eclipse 실행 D:\Lec_hwl\CApp\y2014
Eclipse 실행
Workspace 확인 D:\Lec_hwl\CApp\y2014
CDT Perspective 확인 이 버튼을 클릭해서 수정 Java EE 로 되어 있음
CDT Perspective 확인 C/C++ 선택
CDT Perspective 확인 C/C++ 로 되어 있음
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
프로젝트 명 설정 Ch0803 Empty Project Cygwin GCC D:\Lec_hwl\capp\y2014\Ch0803
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
생성된 빈 프로젝트 본인 컴퓨터의 사양에 따라 내용은 약간씩 다를 수 있음
bst.h 추가 및 작성 Header File 선택
bst.h 추가 및 작성 Ch0803 프로젝트명 설정(자동설정) bst.h 헤더 파일 명 설정
bst.h 추가 및 작성 자동 생성된 빈 헤더 파일 헤더가 여러 소스에서 포함되었을 때 이중으로 포함되지 않도록 하는 매크로 헤더가 여러 소스에서 포함되었을 때 이중으로 포함되지 않도록 하는 매크로 실제 헤더의 내용이 들어갈 위치
bst.h 추가 및 작성 노드 구조체 및 함수 원형 선언
bst.c 추가 및 작성 Source File 선택
foldertree.c 추가 및 작성 Ch0803 프로젝트명 확인(자동설정) bst.c 소스 파일명 설정
bst.c 추가 및 작성 자동 생성된 빈 소스 파일
bst.c 추가 및 작성 필요한 코드 작성(빈 함수 작성) 표준 입출력 함수 헤더 메모리 할당 함수 헤더 이진트리관련 함수 헤더 필요한 각 함수의 원형에 맞게 함수의 몸체를 작성하되, 내용은 모두 빈 것으로 작성한다. 차후에 한 함수씩 코드의 내용을 작성한다.
insertNode() 함수 노드에 저장할 자료를 올바른 위치에 추가한다.
insertNode() 함수 노드에 저장할 자료를 올바른 위치에 추가한다.
removeNode() 함수 주어진 자료를 갖는 노드를 찾아서 삭제하고 트리 를 변형한다.
removeNode() 함수
removeNode() 함수
removeNode() 함수
searchNode() 함수
searchNode() 함수
clearTree() 함수
displayInorder() 함수
ex0803.c 추가 및 작성 Source File 선택
ex0803.c 추가 및 작성 Ch0803 프로젝트명 확인(자동설정) ex0803.c 소스 파일명 설정
추가된 빈 소스 파일 프로젝트에 3 개의 파일 ex0803.c, bst.c, bst.h 가 추가된 것을 확인할 수 있다.
main 함수 작성 빈 main 함수 작성 표준 입출력 함수 헤더 메모리 관련 함수 헤더 이진탐색트리 관련 함수 헤더
main 함수 작성
main 함수 작성
main 함수 작성
빌드 및 실행 결과
도전 문제 위 예제에서 노드의 자료를 정수형으로 하여 다시 작성하시오.
도전문제 예제 8-4를 위의 풀이 방법과 유사하게 작성하시 오.