Æ®¸®·Î ¾î¶² ÀÛ¾÷À» ÇÏ·Á¸é Æ®¸®ÀÇ ¸ðµç ³ëµå¸¦ ÇÑ ¹ø¾¿ ¹æ¹®ÇÏ´Â ¼øÈ¸¸¦ ÇØ¾ß ÇÑ´Ù. ±×·¡¾ß ³ëµåÀÇ °ªÀ» Ãâ·ÂÇϰųª °Ë»ö, »èÁ¦ µîÀÇ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù. ÀÌÁø Æ®¸®¸¦ ±¸¼ºÇÏ´Â ÀÛÀº ¼ºê Æ®¸®´Â ·çÆ®, ¿ÞÂÊ, ¿À¸¥ÂÊ ¼¼ °³ÀÇ ³ëµå·Î ±¸¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ¼¼ ³ëµåÀÇ ¹æ¹® ¼ø¼¿¡ µû¶ó ´ÙÀ½ ¿©¼¸ °¡Áö ¼øÈ¸ ¹æ¹ýÀ» »ý°¢ÇÒ ¼ö ÀÖ´Ù.
¨ç ·çÆ®-¿ÞÂÊ-¿À¸¥ÂÊ ¨è ·çÆ®-¿À¸¥ÂÊ-¿ÞÂÊ
¨é ¿ÞÂÊ-·çÆ®-¿À¸¥ÂÊ ¨ê ¿ÞÂÊ-¿À¸¥ÂÊ-·çÆ®
¨ë ¿À¸¥ÂÊ-·çÆ®-¿ÞÂÊ ¨ì ¿À¸¥ÂÊ-¿ÞÂÊ-·çÆ®
ÀÌ Áß ¿ÞÂÊÀ» ¹Ýµå½Ã ¿À¸¥Âʺ¸´Ù ¸ÕÀú ¼øÈ¸Çϵµ·Ï ÇÑ´Ù¸é ¨ç, ¨é, ¨ê ¼¼ °¡Áö¸¸ ³²´Â´Ù. ÀÌ ¼¼°¡Áö ¼øÈ¸ ¹æ¹ýÀ» °¢°¢ ÀüÀ§ ¼øÈ¸(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°³±îÁöÀÇ ³ëµå°¡ ÀÖ´Â Æ®¸®¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð Å©±â¸¦ ´Ã¸®¸é ¾ó¸¶µçÁö ´õ Å« Æ®¸®µµ ·¹º§ ¼øÈ¸¸¦ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ»óÀ¸·Î Æ®¸®ÀÇ ±âº»ÀûÀÎ ¿ë¾î¿Í ¸¹ÀÌ »ç¿ëµÇ´Â ÀÌÁø Æ®¸®ÀÇ ¸ð¾ç, »ý¼ºÇÏ´Â ¹æ¹ý, ±×¸®°í ¼øÈ¸ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù. ´Ù¼Ò ÀÌ·ÐÀûÀÎ ³»¿ë¸¸ ´Ù·ç¾ú°í ½Ç¹«¿¡ ¹Ù·Î Àû¿ëÇÒ ¼ö ÀÖÀ»¸¸ÇÑ ³»¿ëÀº ¾ø´Â ¼ÀÀε¥ Æ®¸®´Â ¿ö³« ÇüŰ¡ º¯È ¹«½ÖÇØ¼ Àû¿ëµÇ´Â ¾Ë°í¸®Áò¿¡ µû¶ó ±¸Çö ¹æ¹ýÀÌ ´Ù¾çÇϹǷΠ¿©±â¼ ÀÀ¿ëÀ» ´Ù·ç±â´Â ¾î·Æ´Ù.