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