#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판을 참조했습니다.

Posted by 정훈승