19-5-´Ù.Æ®¸®ÀÇ ¼øÈ¸

Æ®¸®·Î ¾î¶² ÀÛ¾÷À» ÇÏ·Á¸é Æ®¸®ÀÇ ¸ðµç ³ëµå¸¦ ÇÑ ¹ø¾¿ ¹æ¹®ÇÏ´Â ¼øÈ¸¸¦ ÇØ¾ß ÇÑ´Ù. ±×·¡¾ß ³ëµåÀÇ °ªÀ» Ãâ·ÂÇϰųª °Ë»ö, »èÁ¦ µîÀÇ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù. ÀÌÁø Æ®¸®¸¦ ±¸¼ºÇÏ´Â ÀÛÀº ¼­ºê Æ®¸®´Â ·çÆ®, ¿ÞÂÊ, ¿À¸¥ÂÊ ¼¼ °³ÀÇ ³ëµå·Î ±¸¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ¼¼ ³ëµåÀÇ ¹æ¹® ¼ø¼­¿¡ µû¶ó ´ÙÀ½ ¿©¼¸ °¡Áö ¼øÈ¸ ¹æ¹ýÀ» »ý°¢ÇÒ ¼ö ÀÖ´Ù.

 

¨ç ·çÆ®-¿ÞÂÊ-¿À¸¥ÂÊ ¨è ·çÆ®-¿À¸¥ÂÊ-¿ÞÂÊ

¨é ¿ÞÂÊ-·çÆ®-¿À¸¥ÂÊ ¨ê ¿ÞÂÊ-¿À¸¥ÂÊ-·çÆ®

¨ë ¿À¸¥ÂÊ-·çÆ®-¿ÞÂÊ ¨ì ¿À¸¥ÂÊ-¿ÞÂÊ-·çÆ®

 

ÀÌ Áß ¿ÞÂÊÀ» ¹Ýµå½Ã ¿À¸¥Âʺ¸´Ù ¸ÕÀú ¼øÈ¸Çϵµ·Ï ÇÑ´Ù¸é ¨ç, ¨é, ¨ê ¼¼ °¡Áö¸¸ ³²´Â´Ù. ÀÌ ¼¼°¡Áö ¼øÈ¸ ¹æ¹ýÀ» °¢°¢ ÀüÀ§ ¼øÈ¸(PreOrder), ÁßÀ§ ¼øÈ¸(InOrder), ÈÄÀ§ ¼øÈ¸(PostOrder)¶ó°í Çϴµ¥ ·çÆ®ÀÇ ¹æ¹® À§Ä¡¿¡ µû¶ó À̸§À» ºÙÀδÙ. ÀüÀ§ ¼øÈ¸´Â ·çÆ®¸¦ ¸ÕÀú ¹æ¹®Çϰí Á¿츦 °¢°¢ ¹æ¹®Çϸç ÁßÀ§ ¼øÈ¸´Â ¿ÞÂÊÀ» ¸ÕÀú ¹æ¹®ÇÏ°í ·çÆ®¸¦ Áß°£¿¡ ¹æ¹®ÇÏ¸ç ¸¶Áö¸·À¸·Î ¿À¸¥ÂÊÀ» ¹æ¹®ÇÏ´Â ¹æ½ÄÀÌ´Ù.

Â÷Àϵ尡 ¶Ç ´Ù¸¥ ÀÚ½ÄÀ» °¡Áö°í ÀÖ´Ù¸é Â÷ÀϵåÀÇ ÀÚ½ÄÀ» ¸ÕÀú ¼øÈ¸ÇÏ°í µ¹¾Æ¿Í¾ß ÇϹǷΠƮ¸®ÀÇ ¼øÈ¸ ÇÔ¼öµéÀº Àç±ÍÀûÀΠȣÃâÀ» ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â °£´ÜÇÑ Æ®¸®¸¦ »ý¼ºÇϰí ÀÌ Æ®¸®¸¦ ¼¼ °¡Áö ¹æ¹ýÀ¸·Î ¸ðµÎ ¼øÈ¸Çϸ鼭 ³ëµåÀÇ °ªÀ» Ãâ·ÂÇÑ´Ù.

 

¿¹ Á¦ : TreeTraverse

#include <Turboc.h>

 

struct Node

{

     int data;

     Node *left;

     Node *right;

};

Node *Root;

 

void InitTree(int data)

{

     Root=(Node *)malloc(sizeof(Node));

     Root->data=data;

}

 

Node *AddChild(Node *Parent,int data,BOOL bLeft)

{

     Node *New;

 

     New=(Node *)malloc(sizeof(Node));

     New->data=data;

     New->left=NULL;

     New->right=NULL;

     if (bLeft) {

          Parent->left=New;

     } else {

          Parent->right=New;

     }

     return New;

}

 

void PreOrder(Node *R)

{

     printf("%d ",R->data);

     if (R->left) PreOrder(R->left);

     if (R->right) PreOrder(R->right);

}

 

void InOrder(Node *R)

{

     if (R->left) InOrder(R->left);

     printf("%d ",R->data);

     if (R->right) InOrder(R->right);

}

 

void PostOrder(Node *R)

{

     if (R->left) PostOrder(R->left);

     if (R->right) PostOrder(R->right);

     printf("%d ",R->data);

}

 

void FreeTree(Node *R)

{

     if (R->left) FreeTree(R->left);

     if (R->right) FreeTree(R->right);

     free(R);

}

 

void main()

{

     Node *Left,*Right;

 

     InitTree(1);

     Left=AddChild(Root,2,TRUE);

     Right=AddChild(Root,3,FALSE);

     AddChild(Left,4,TRUE);

     AddChild(Left,5,FALSE);

     AddChild(Right,6,TRUE);

 

     PreOrder(Root);puts("");

     InOrder(Root);puts("");

     PostOrder(Root);puts("");

 

     FreeTree(Root);

}

 

Æ®¸®¸¦ ÃʱâÈ­ÇÏ°í Æ®¸®¿¡ ³ëµå¸¦ Ãß°¡ÇÏ´Â InitTree, AddChild ÇÔ¼ö°¡ ÀÛ¼ºµÇ¾î Àִµ¥ InitTree´Â ·çÆ®¸¸ »ý¼ºÇϰí AddChild´Â ÁöÁ¤ÇÑ ºÎ¸ðÀÇ ¿ÞÂÊÀ̳ª ¿À¸¥ÂÊ¿¡ Â÷Àϵ带 Ãß°¡ÇÑ´Ù. AddChildÀÇ ÄÚµå´Â ¿¬°á ¸®½ºÆ®ÀÇ ¸µÅ© Á¶ÀÛ ÄÚµå¿Í ºñ½ÁÇÏ°Ô ÀÛ¼ºµÇ¾î ÀÖ´Ù. ÀÌ µÎ ÇÔ¼ö´Â ¾îµð±îÁö³ª ÀÎÀ§ÀûÀÎ Å×½ºÆ® Æ®¸®¸¦ »ý¼ºÇϱâ À§ÇØ ÀÛ¼ºÇÑ °ÍÀÌ¸ç ½ÇÁ¦ Æ®¸® »ý¼º ¹æ¹ýÀº ¾Ë°í¸®Áò¿¡ µû¶ó Ư¼öÇÏ°Ô ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù. main¿¡¼­´Â Á¤¼ö¸¦ µ¥ÀÌÅÍ·Î °¡Áö´Â ´ÙÀ½°ú °°Àº Æ®¸®¸¦ »ý¼ºÇÑ´Ù.

ÀÌ·¸°Ô ¸¸µé¾îÁø Æ®¸®¸¦ ¼¼ °¡Áö ¹æ¹ýÀ¸·Î ¼øÈ¸Çϸ鼭 µ¥ÀÌÅ͸¦ Ãâ·ÂÇϴµ¥ ´ëÇ¥ÀûÀ¸·Î ·çÆ®¸¦ ¸ÕÀú ¹æ¹®ÇÏ´Â PreOrder ÇÔ¼ö¸¦ º¸ÀÚ. ·çÆ®¸¦ ¿ì¼±ÀûÀ¸·Î ó¸®ÇØ¾ß ÇϹǷΠÀÚ½ÅÀÇ µ¥ÀÌÅ͸¦ printf ÇÔ¼ö·Î ¸ÕÀú Ãâ·ÂÇß´Ù. ¿©±â¼­ printf ÇÔ¼ö È£ÃâÀº ¼øÈ¸Áß¿¡ ÇϰíÀÚ ÇÏ´Â ÀÛ¾÷¿¡ ÇØ´çÇϴµ¥ °Ë»öÀ̶ó¸é data¸¦ ºñ±³ÇÏ°í »èÁ¦¶ó¸é ³ëµå Á¦°Å ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÉ °ÍÀÌ´Ù.

±×¸®°í ·çÆ®ÀÇ ¿ÞÂÊ, ¿À¸¥ÂÊ °¢°¢À» Ãâ·ÂÇ쵂 °¢ Â÷ÀϵåµéÀÌ ¶Ç ´Ù¸¥ ¼­ºê Æ®¸®ÀÏ ¼öµµ ÀÖÀ¸¹Ç·Î ÀÌ ¼­ºê Æ®¸®¿¡ ´ëÇØ¼­µµ PreOrder ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Â÷ÀϵåÀÇ ·çÆ®ºÎÅÍ ¸ðµç Â÷Àϵ带 Ãâ·ÂÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. ±×·¡¼­ ÀÚ½ÅÀ» ´Ù½Ã È£ÃâÇÏ´Â Àç±Í È£Ãâ ±¸Á¶¸¦ °¡Áö°í ÀÖ´Ù. À§ ±×¸²¿¡¼­ 1À» Ãâ·ÂÇÒ ¶§ ¿ÞÂÊ Â÷Àϵå 2°¡ ¶Ç ´Ù¸¥ ¼­ºê Æ®¸®À̹ǷΠ2¿¡ ´ëÇØ¼­µµ PreOrder ÇÔ¼ö¸¦ È£ÃâÇÏ¿´´Ù.

PreOrder(2) È£ÃâÀº ÀÚ½ÅÀ» ¸ÕÀú Ãâ·ÂÇÏ°í ¶Ç 4, 5¹ø ÀڽĿ¡ ´ëÇØ ÀüÀ§ ¼øÈ¸¸¦ Ç쵂 4, 5´Â ¸ðµÎ Â÷¼ö°¡ 0ÀÎ ÀÙ ³ëµåÀ̹ǷΠ´õ ÀÌ»ó Àç±Í¸¦ ÇÏÁö ¾Ê°í ÀڽŸ¸ Ãâ·ÂÇÑ ÈÄ ¸®ÅÏÇÒ °ÍÀÌ´Ù. 2¹ø ¼­ºê Æ®¸®ÀÇ Ãâ·ÂÀÌ ³¡³ª¸é ´ÙÀ½¹ø È£ÃâÀÎ PreOrder(3)ÀÌ È£ÃâµÇ¾î ¿À¸¥ÂÊ ¼­ºê Æ®¸®°¡ Ãâ·ÂµÈ´Ù. °¢ ¼­ºê Æ®¸®¿¡ ´ëÇØ ·çÆ®¿Í Â÷Àϵ带 ¸ðµÎ °ÅÄ¡¹Ç·Î Æ®¸®ÀÇ ¸ðµç ³ëµå¸¦ ¼øÈ¸ÇÏ°Ô µÈ´Ù. ÁßÀ§ ¼øÈ¸ÇÏ´Â InOrder, ÈÄÀ§ ¼øÈ¸ÇÏ´Â PostOrder ÇÔ¼öµµ ·çÆ®¸¦ ó¸®ÇÏ´Â ¼ø¼­¸¸ ´Ù¸¦ »Ó Àç±Í ±¸Á¶´Â µ¿ÀÏÇÏ´Ù.

Àç±Í È£ÃâÀ» »ç¿ëÇÏÁö ¾ÊÀ¸·Á¸é ÀÚ½Ä ³ëµå·Î ³»·Á °¡±â Àü¿¡ ½ºÅÿ¡ µ¹¾Æ¿Ã ¹øÁö¸¦ Ǫ½ÃÇϸ鼭 ¼øÈ¸ÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª Æ®¸®´Â ÀÚ·á ±¸Á¶ ÀÚü°¡ Àç±ÍÀûÀ̱⠶§¹®¿¡ Àç±Í È£ÃâÀ» »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå ÀÚ¿¬½º·´´Ù. main¿¡¼­´Â ¼¼ ¹æ¹ýÀ¸·Î ¼øÈ¸ÇÑ °á°ú¸¦ Ãâ·ÂÇϴµ¥ ¼ø¼­°¡ Ʋ¸± »ÓÀÌÁö °á±¹ ¸ðµç ³ëµå¸¦ ÇÑ ¹ø¾¿ ¹æ¹®ÇÑ´Ù.

 

1 2 4 5 3 6

4 2 5 1 6 3

4 5 2 6 3 1

 

 »ý¼ºÇÑ Æ®¸®¸¦ ÇØÁ¦ÇÏ´Â FreeTree ÇÔ¼ö´Â °¢ ³ëµå¸¦ ÇØÁ¦Ç쵂 ÀÚ½Ä ³ëµå¸¦ ¸ÕÀú ÇØÁ¦ÇÑ ÈÄ ·çÆ®¸¦ ÇØÁ¦ÇØ¾ß ÇϹǷΠÈÄÀ§ ¼øÈ¸¹ýÀ» »ç¿ëÇÑ´Ù. ·çÆ®¸¦ ¸ÕÀú ÇØÁ¦Çϸé ÀÚ½Ä ³ëµå¸¦ ¾Ë ¼ö ¾ø°Ô µÇ¹Ç·Î ÈÄÀ§ ¼øÈ¸°¡ ÀûÇÕÇÏ´Ù.

·¹º§º° ¼øÈ¸´Â ·¹º§ÀÌ ³·Àº ¼øÀ¸·Î ³ëµå¸¦ ¹æ¹®ÇÏ´Â ¹æ½ÄÀÌ´Ù. ÀüÀ§, ÁßÀ§, ÈÄÀ§ ¼øÈ¸´Â ÀÏ´Ü ÁÖ¾îÁø ¼­ºê Æ®¸®¸¦ ¸ÕÀú ¿ÏÀüÈ÷ ¹æ¹®ÇÑ ÈÄ ´ÙÀ½ ¼­ºê Æ®¸®¸¦ ãÁö¸¸ ·¹º§º° ¼øÈ¸´Â ¼­ºê Æ®¸®¸¦ ±âÁØÀ¸·Î ÇÏÁö ¾Ê°í ·¹º§À» ±âÁØÀ¸·Î ÇϹǷΠÀç±Í È£ÃâÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù. ´ë½Å ³ëµå¸¦ ¸¸³¯ ¶§¸¶´Ù ÀÚ½ÅÀ» Ãâ·ÂÇÑ ÈÄ ÀÚ½ÅÀÇ ÀڽĵéÀ» Â÷·Ê´ë·Î Å¥¿¡ ¹Ð¾î ³Ö¾î Á÷°è ÀڽĵéÀÌ ¿ì¼±ÀûÀ¸·Î 󸮵ǵµ·Ï ÇÑ´Ù.

 

¿¹ Á¦ : LevelTraverse

#include <Turboc.h>

 

struct Node

{

     int data;

     Node *left;

     Node *right;

};

Node *Root;

 

Node **Queue;

int QSize;

int head,tail;

 

void InitQueue(int size)

{

     QSize=size;

     Queue=(Node **)malloc(QSize*sizeof(Node *));

     head=tail=0;

}

 

void FreeQueue()

{

     free(Queue);

}

 

BOOL Insert(Node *data)

{

     if ((tail+1) % QSize == head) {

          return FALSE;

     }

     Queue[tail]=data;

     tail=(tail+1) % QSize;

     return TRUE;

}

 

Node *Delete()

{

     Node *data;

 

     if (head==tail) {

          return NULL;

     }

     data=Queue[head];

     head=(head+1) % QSize;

     return data;

}

 

void InitTree(int data)

{

     Root=(Node *)malloc(sizeof(Node));

     Root->data=data;

}

 

Node *AddChild(Node *Parent,int data,BOOL bLeft)

{

     Node *New;

 

     New=(Node *)malloc(sizeof(Node));

     New->data=data;

     New->left=NULL;

     New->right=NULL;

     if (bLeft) {

          Parent->left=New;

     } else {

          Parent->right=New;

     }

     return New;

}

 

void FreeTree(Node *R)

{

     if (R->left) FreeTree(R->left);

     if (R->right) FreeTree(R->right);

     free(R);

}

 

void LevelOrder(Node *R)

{

     Node *tNode;

 

     Insert(R);

     while (head != tail) {

          tNode=Delete();

          printf("%d ",tNode->data);

          if (tNode->left) Insert(tNode->left);

          if (tNode->right) Insert(tNode->right);

     }

}

 

void main()

{

     Node *Left,*Right;

 

     InitQueue(128);

     InitTree(1);

     Left=AddChild(Root,2,TRUE);

     Right=AddChild(Root,3,FALSE);

     AddChild(Left,4,TRUE);

     AddChild(Left,5,FALSE);

     AddChild(Right,6,TRUE);

 

     LevelOrder(Root);puts("");

 

     FreeTree(Root);

     FreeQueue();

}

 

¾Õ¿¡¼­ ¸¸µé¾ú´ø Å¥ °ü·Ã ÇÔ¼ö¸¦ ±×´ë·Î º¹»çÇØ ¿ÀµÇ Å¥¿¡ µé¾î°¡´Â µ¥ÀÌÅͰ¡ Node * ŸÀÔÀ̶ó´Â Á¡ÀÌ ´Ù¸£´Ù. LevelOrder ÇÔ¼ö´Â Å¥¿¡ ÀúÀåµÈ ³ëµå¸¦ ¼ø¼­´ë·Î ²¨³» Ãâ·ÂÇϴµ¥ ¸ÕÀú ·çÆ®ºÎÅÍ Å¥¿¡ ¹Ð¾î ³Ö°í ·çÇÁ¸¦ ½ÃÀÛÇÑ´Ù. ¸Å ·çÇÁ¿¡¼­ Å¥¿¡ ÃÖÈÄ·Î ÀúÀåµÈ ³ëµå¸¦ ²¨³» ÀÌ ³ëµå¸¦ Ãâ·ÂÇϰí ÀÚ½ÅÀÇ Â÷Àϵ带 Â÷·Ê´ë·Î Å¥¿¡ »ðÀÔÇÑ´Ù. ù ¹øÂ° ·çÇÁ¿¡¼­ 1ÀÌ Ãâ·ÂµÇ°í 1ÀÇ ÀÚ½Ä 2¿Í 3ÀÌ Â÷·Ê´ë·Î Å¥¿¡ µé¾î°¬À» °ÍÀÌ´Ù.

´ÙÀ½ ¹ø ·çÇÁ¸¦ µ¹ ¶§´Â ´ÙÀ½ ·¹º§ÀÎ 2¿Í 3ÀÌ ¼ø¼­´ë·Î Å¥¿¡¼­ ²¨³»Á® 󸮵Ǵµ¥ À̶§ 2¿Í 3ÀÇ °¢ ÀÚ½ÄÀÎ 4, 5, 6ÀÌ Â÷·Ê´ë·Î Å¥¿¡ »ðÀÔµÇ¾î ´ÙÀ½ Â÷·Ê¸¦ ±â´Ù¸± °ÍÀÌ´Ù. ·¹º§ 2ÀÇ ³ëµåµéÀÌ Ã³¸®µÇ´Â °úÁ¤¿¡¼­ ·¹º§ 2ÀÇ ÀÚ½Ä ³ëµåÀÎ ·¹º§ 3ÀÇ ¸ðµç ³ëµå°¡ Å¥¿¡ »ðÀԵǴ °ÍÀÌ´Ù. ±×·¡¼­ ´ÙÀ½ ·¹º§¿¡¼­´Â »çÃ̵鳢¸® ¸ð¾Æ¼­ Ãâ·ÂµÇ¸é¼­ ·¹º§ 4ÀÇ ÀÚ½Ä ³ëµåµéÀÌ »ðÀԵȴÙ. ÀÌ·± ½ÄÀ¸·Î ·¹º§º°·Î Á¿¡¼­ ¿ì·Î ¸ðµç ³ëµå¸¦ Å¥¿¡ »ðÀÔÇϸ鼭 Çϳª¾¿ ²¨³» Ãâ·ÂÇÏ¸é ·¹º§º° ¼øÈ¸¸¦ ÇÒ ¼ö ÀÖ´Ù.

¸ÕÀú »ðÀÔµÈ ³ëµå°¡ ¸ÕÀú 󸮵Ǿî¾ß ÇϹǷΠÀÌ °æ¿ì´Â Å¥°¡ °¡Àå ÀûÀýÇÏ´Ù. À̶§ Å¥ÀÇ Å©±â´Â ÇÑ ·¹º§ÀÇ ÃÖ´ë ³ëµå °³¼ö¸¸Å­À̾î¾ß Çϴµ¥ ¿¹Á¦ÀÇ °æ¿ì 128·Î Àâ¾ÒÀ¸¹Ç·Î ÇÑ ·¹º§¿¡ ÃÖ´ë 128°³±îÁöÀÇ ³ëµå°¡ ÀÖ´Â Æ®¸®¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð Å©±â¸¦ ´Ã¸®¸é ¾ó¸¶µçÁö ´õ Å« Æ®¸®µµ ·¹º§ ¼øÈ¸¸¦ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

ÀÌ»óÀ¸·Î Æ®¸®ÀÇ ±âº»ÀûÀÎ ¿ë¾î¿Í ¸¹ÀÌ »ç¿ëµÇ´Â ÀÌÁø Æ®¸®ÀÇ ¸ð¾ç, »ý¼ºÇÏ´Â ¹æ¹ý, ±×¸®°í ¼øÈ¸ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù. ´Ù¼Ò ÀÌ·ÐÀûÀÎ ³»¿ë¸¸ ´Ù·ç¾ú°í ½Ç¹«¿¡ ¹Ù·Î Àû¿ëÇÒ ¼ö ÀÖÀ»¸¸ÇÑ ³»¿ëÀº ¾ø´Â ¼ÀÀε¥ Æ®¸®´Â ¿ö³« ÇüŰ¡ º¯È­ ¹«½ÖÇØ¼­ Àû¿ëµÇ´Â ¾Ë°í¸®Áò¿¡ µû¶ó ±¸Çö ¹æ¹ýÀÌ ´Ù¾çÇϹǷΠ¿©±â¼­ ÀÀ¿ëÀ» ´Ù·ç±â´Â ¾î·Æ´Ù.