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.0300 sec