U E D R , A S I H C RSS

Data Structure/Tree


1. Tree ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค

  • Node : ๋…ธ๋“œ
  • Root : ๋งจ ๊ผญ๋Œ€๊ธฐ ๋…ธ๋“œ
  • Edge : ๋…ธ๋“œ์™€ ๋…ธ๋“œ๋ฅผ ์ด์–ด์ฃผ๋Š” ์„ 
  • Degree : ๋…ธ๋“œ์— ๋”ธ๋ ค์žˆ๋Š” Edge์˜ ์ˆ˜
  • Parent : ๋ถ€๋ชจ ๋…ธ๋“œ
  • Child : ์ž์‹ ๋…ธ๋“œ
  • Level : ๋ช‡์ธต?
  • Sibling : ํ˜•์ œ(๊ฐ™์€ ๋ ˆ๋ฒจ์˜) ๋…ธ๋“œ
  • Height : Maximum Level

2. Binary Tree

  • ์ž์‹์€ 0 - 2๊ฐœ
  • ์™ผ์ชฝ ์ž์‹, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๊ตฌ๋ณ„
  • ๊นŠ์ด k์˜ ์ตœ๋Œ€ ๋…ธ๋“œ์ˆ˜ = 2^k - 1
  • ๋ ˆ๋ฒจ i์˜ ์ตœ๋Œ€ ๋…ธ๋“œ์ˆ˜ = 2^(i-1)
  • n0์„ ์žŽ์‚ฌ๊ท€ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜, n2๋ฅผ Degree๊ฐ€ 2์ธ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๋ผ๊ณ  ํ•˜๋ฉด n0 = n2 + 1 ์ด๋ผ๋Š” ๊ณต์‹์ด ์„ฑ๋ฆฝํ•œ๋‹ค.

3. Binray Tree ์˜ ํ‘œํ˜„

  • ๋ฐฐ์—ด
    • ๊ทธ๋ƒฅ ์ฐจ๋ก€๋Œ€๋กœ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ๋ฃจํŠธ, ์™ผ์ชฝ ์ž์‹, ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ์ˆœ์œผ๋กœ.. ๋น„์–ด์žˆ๋Š”๊ฑด ์Œฉ๊น๋‹ค.
    • ์ธ๋ฑ์Šค ์ ‘๊ทผํ• ๋•Œ๋Š”
      • Left Child : ์ธ๋ฑ์Šค * 2
      • Right Child : ์ธ๋ฑ์Šค * 2 + 1
      • Parent : ์ธ๋ฑ์Šค/2 -> ๋‚ด๋ฆผ
  • Linked List
    • ๋…ธ๋“œ์—๋Š” ๋ฐ์ดํ„ฐ์™€ ์™ผ์ชฝ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ, ์˜ค๋ฅธ์ชฝ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

4. Binary Tree Traversal

  • PreOrder : Root -> Left Child -> Right Child : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๋ฐฉ์‹

~cpp 
PreOrder(a) 
{
    if(a)
    {
        visit a
        Preorder(a->left)
        Preorder(a->right)
    }
}

  • InOrder : Left Child -> Root -> Right Child : ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€์žฅ ์ต์ˆ™ํ•œ ๋ฐฉ์‹

~cpp 
InOrder(a) 
{
    if(a)
    {
        InOrder(a->left)
        visit a
        InOrder(a->right)
    }
}

  • PostOrder : Left Child -> Right Child -> Root

~cpp 
PostOrder(a) 
{
    if(a)
    {
        PostOrder(a->left)
        PostOrder(a->right)
        visit a
    }
}

  • LevelOrder : ๋ ˆ๋ฒจ ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธ

~cpp 
AddQ(Root)
while(1)
{
    a = DeleteQ();
    Visit a;
    if(!a) break;
    if(a->left) AddQ(a->left)
    if(a->right) AddQ(a->right)
}

5. Binary Search Trees (์šฐ๋ฆฌ๋ง๋กœ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ)

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ๋น ๋ฅธ ํƒ์ƒ‰์„ ์ž๋ž‘ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ต๋‹ˆ๋‹ค.(๋งž๋‚˜?--;)
    • ์ผ๋ฐ˜ ํƒ์ƒ‰ : ฮธ(n)
    • ์ด์ง„ ํƒ์ƒ‰ : ฮธ(log2 n) - 2๋Š” ๋ฐ‘์ž…๋‹ˆ๋‹ค. ์ฒจ์ž ํ‘œํ˜„ํ•˜๋Š”๋ฒ• ์•„์‹œ๋Š”๋ถ„?--;
    • n์ด ํ•œ 2048์ •๋„ ๋œ๋‹ค๊ณ  ํ•˜๋ฉด ์ผ๋ฐ˜ ํƒ์ƒ‰์€ 2048์ด ๊ฑธ๋ฆฌ๋Š” ๋ฐ˜๋ฉด ์ด์ง„ ํƒ์ƒ‰์€ 11๋ฐ–์— ์•ˆ๊ฑธ๋ฆฐ๋‹ค๋Š” ๋ง์ด์ ธ
    • but, ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ด์ง„ ํƒ์ƒ‰ ๋‚˜๋ฌด๋“  ๋ญ๋“  ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์•ˆ๋‚˜์˜จ๋‹จ ๋ง์ž…๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ๊ผฌ์ด๋Š”๋ฐ ๋ฌด์Šจ..--;
  • ์กฐ๊ฑด
    • Binray Search Tree ๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ Binary Tree ์—ฌ์•ผ ํ•œ๋‹ค.
    • Keys in Left Subtree < Keys of Node
    • Keys in Right Subtree > Keys of Node(๊ณ ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹จ ๋ง์ž…๋‹ˆ๋‹ค.)
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • Search x => Compare with Root
      • if x = Root's Key then ์ฐพ์•˜์œผ๋‹ˆ๊นŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋
      • else if x > Root's Key Root๋ฅผ Right Subtree์˜ Root๋กœ ์…‹ํŒ…. ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ ๋‹ค์‹œ ์‹œ์ž‘
      • else if x < Root's Key Root๋ฅผ Left Subtree์˜ Root๋กœ ์…‹ํŒ…. ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ ๋‹ค์‹œ ์‹œ์ž‘

6. Insert x

  • ๋ฃจํŠธ๋กœ๋ถ€ํ„ฐ ํฌ๊ธฐ์— ๋งž์ถฐ ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋Œ์•„๋Œ•๊ธฐ๋‹ค๊ฐ€ ๋งž๋Š” ๋ถ€๋ถ„์— ์ถ”๊ฐ€์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

7. Delete x(์š”๊ฑด ์ชผ๊ธˆ ๋ณต์žกํ•จ)

  • Search x
    • ๋งŒ์•ฝ x๊ฐ€ leaf(๋งจ ๋ ๋…ธ๋“œ) - ๊ทธ๋ƒฅ ์ง€์šฐ๋ฉด ๋˜์ง€ ๋ญ..--;
    • x์˜ Child๊ฐ€ 1๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ - ๊ทธ ๋…ธ๋“œ ์ง€์šฐ๊ณ  ๊ทธ ์ž์‹๋“ค์„ ๋‹ค ์œ„๋กœ ์˜ฌ๋ฆฐ๋‹ค. ๊ณ ๋กœ ํ• ์•„๋ฒ„์ง€์˜ ์ž์‹์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.(๋ญ”๊ฐ€ ์ข€ ์ด์ƒ?--;)
    • x์˜ Child๊ฐ€ 2๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ - ๊ทธ ๋…ธ๋“œ์˜ Left Subtree์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค. ์ด๊ฐ’์„ y๋ผ๊ณ  ํ•˜๋ฉด y๋Š” ์˜ค๋ฅธ์ชฝ Child๊ฐ€ ์—†๋‹ค. y๋ฅผ x์ž๋ฆฌ์— ๊ฐ–๋‹ค ๋†“๊ณ  ์—ฌ๊ธฐ์„œ ๋‹ค์‹œ
      • y๊ฐ€ Child ์—†์œผ๋ฉด - ๊ทธ๋ƒฅ ์ง€์šด๋‹ค.
      • y๊ฐ€ Child ์žˆ์œผ๋ฉด - ๊ทธ ๋ฐ‘์˜ ๋…ธ๋“œ๋“ค์„ ํ•œ๋‹จ๊ณ„ ์œ„๋กœ.. ๊ณ ๋กœ ํ• ์•„๋ฒ„์ง€์˜ ์ž์‹

8. Tree์— ๊ด€๋ จ๋œ ์—ฐ์‚ฐ ๋ช‡๊ฐ€์ง€(Cross Reference ํ• ๋•Œ ํ–ˆ๋˜๊ฑฐ ์•ฝ๊ฐ„ ๋ณ€ํ˜•์‹œ์ผฐ์Œ. C++์‹์œผ๋กœ๋Š” ๋‚˜์ค‘์—-.-)

~cpp 
// ํŠธ๋ฆฌ์— ๊ด€ํ•œ ํ•จ์ˆ˜๋“ค

void init(Node** node,char* ch)			// ์ดˆ๊ธฐํ™”
{
	(*node)->pLeft = (*node)->pRight = NULL;	// ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ์ž์‹ NULL๋กœ
	(*node)->Data = new char[strlen(ch) + 1];	// ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ํ• ๋‹น
	strcpy((*node)->Data,ch);			// ๋…ธ๋“œ์— ๋ฌธ์ž์—ด ๋ณต์‚ฌ
}

void PrintandDelete(Node* root)			// ๋งจ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœํšŒ(Preorder์ธ๊ฐ€?)
{
    if( root->pLeft )		
        Print( root->pLeft );

    cout << root->Data << endl;

    if( root->pRight )
        Print( root->pRight );

    delete root;					// ํ• ๋‹น๋œ ๋…ธ๋“œ ์ œ๊ฑฐ
}

int Add(Node** root,char* ch)
{
    if(!(*root))					// ์•„๋ฌด๊ฒƒ๋„ ์—†์„๋•Œ
    {
        *root = new Node;				// ํ• ๋‹น
        init(root,ch);		   	         // ์ดˆ๊ธฐํ™”
        return 1;
    }
	
    else if(strcmp((*root)->Data,ch)>0)		// ๋ถ€๋ชจ๊ฐ€ ์ž์‹๋ณด๋‹ค ํฌ๋ฉด ์™ผ์ชฝ์— ์ถ”๊ฐ€
	return add(&((*root)->pLeft),ch);
    else if(strcmp((*root)->Data,ch)<0)		// ๋ถ€๋ชจ๊ฐ€ ์ž์‹๋ณด๋‹ค ์ž‘์œผ๋ฉด ์˜ค๋ฅธ์ชฝ์— ์ถ”๊ฐ€
	return add(&((*root)->pRight),ch);
    else if(strcmp((*root)->Data,ch)==0)		// ๊ฐ™์œผ๋ฉด ์นด์šดํ„ฐ ์ฆ๊ฐ€
	return 1;
}



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:05
Processing time 0.0063 sec