#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 자기 참조 구조체
struct treeNode {
struct treeNode *leftPtr; // 왼쪽 하위 트리를 가리키는 포인터
int data; // 노드 값
struct treeNode *rightPtr; // 오른쪽 하위 트리를 가리키는 포인터
}; // treeNode 구조체 끝
typedef struct treeNode TreeNode; // struct treeNode와 동의어
typedef TreeNode *TreeNodePtr; // TreeNode*와 동의어
// 프로토 타입
void insertNode( TreeNodePtr *treePtr, int value );
void inOrder( TreeNodePtr treePtr );
void preOrder( TreeNodePtr treePtr );
void postOrder( TreeNodePtr treePtr );
// 프로그램 실행은 메인 함수에서 스타트
int main()
{
int i; // 1~10까지 루프하기 위한 카운터
int item; // 무작위 수를 포함할 변수
TreeNodePtr rootPtr = NULL; // 트리를 NULL로 초기화
srand( time( NULL ) );
printf( "트리에 숫자를 입력하세요 : \n" );
// for문을 이용해 트리에 1~15 사이의 무작위 값을 삽입
for ( i = 1; i <= 10; i++ ) {
item = rand() % 15;
printf( "%3d", item );
insertNode( &rootPtr, item );
}
// 트리를 전위로 순회
printf( "\n\n전위표현식 : \n" );
preOrder( rootPtr );
// 트리를 중위로 순회
printf( "\n\n중위표현식 : \n" );
inOrder( rootPtr );
// 트리를 후위로 순회
printf( "\n\n후위표현식 : \n" );
postOrder( rootPtr );
return 0; // 종료
}
// 트리에 노드 추가
void insertNode( TreeNodePtr *treePtr, int value )
{
// 트리가 비어있다면
if ( *treePtr == NULL ) {
*treePtr = malloc( sizeof( TreeNode ) );
// 메모리를 할당하면 데이터 대입
if ( *treePtr != NULL ) {
( *treePtr )->data = value;
( *treePtr )->leftPtr = NULL;
( *treePtr )->rightPtr = NULL;
}
else {
printf( "%d 값이 잘못되었거나, 에러입니다.\n", value );
}
}
// 트리가 비어있지 않으면
else {
// ① 현재 노드의 데이터보다 삽입할 데이터가 작을 경우
if ( value < ( *treePtr )->data ) {
insertNode( &( ( *treePtr )->leftPtr ), value );
}
// ② 현재 노드의 데이터보다 삽입할 데이터가 더 클 경우
else if ( value > ( *treePtr )->data ) {
insertNode( &( ( *treePtr )->rightPtr ), value );
}
// 중복된 값은 무시
else {
printf( "중복" );
}
}
} // insertNode 함수 끝
// 트리를 중위로 순회
void inOrder( TreeNodePtr treePtr )
{
// 만약 트리가 비어있지 않으면 순회
if ( treePtr != NULL ) {
inOrder( treePtr->leftPtr );
printf( "%3d", treePtr->data );
inOrder( treePtr->rightPtr );
}
} // inOrder 중위 함수 끝
// 트리를 전위로 순회
void preOrder( TreeNodePtr treePtr )
{
// 만약 트리가 비어있지 않으면 순회
if ( treePtr != NULL ) {
printf( "%3d", treePtr->data );
preOrder( treePtr->leftPtr );
preOrder( treePtr->rightPtr );
}
} // preOrder 전위 함수 끝
// 트리를 후위로 순회
void postOrder( TreeNodePtr treePtr )
{
// 만약 트리가 비어있지 않으면 순회
if ( treePtr != NULL ) {
postOrder( treePtr->leftPtr );
postOrder( treePtr->rightPtr );
printf( "%3d", treePtr->data );
}
} // postOrder 후위 함수 끝
// 아주 쉽죠? 이정도 소스는 다들 아시리라 믿습니다만, 혹시나 모르는 분이 계실까봐...
// (DEITEL출판사) C HOW TO PROTRAM 제4판을 참조했습니다.