์ž๋ฃŒ ๊ตฌ์กฐ

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

youngdeok 2023. 2. 28. 20:05

์ด์ง„ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ด์ง„ํŠธ๋ฆฌ์˜ ์ผ์ข…์ด๋‹ค.

์ด์ง„ ํƒ์ƒ‰ํŠธ๋ฆฌ๋Š” ์ €์žฅ ํ•  ๋•Œ ํ์น™์ด ์žˆ๋‹ค.

  • ์•„์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์— ์ €์žฅ๋œ ํ‚ค๋Š” ์œ ์ผํ•˜๋‹ค.
  • ๋ฃจํŠธ ๋…ธ๋“œ์˜ ํ‚ค๊ฐ€ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์–ด๋– ํ•œ ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ํฌ๋‹ค.
  • ๋ฃจํŠธ ๋…ธ๋“œ์˜ ํ‚ค๊ฐ€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์–ด๋– ํ•œ ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ์ž‘๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๊ฐ’์„ ํƒ์ƒ‰ ํ•  ๋•Œ, ๊ธธ์„ ์žƒ์„ ์ผ์ด ์—†์„ ๊ฒƒ์ด๋‹ค.

์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค < ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค < ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค

์ด์ง„ ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ์ถ”์ƒ ์ž๋ฃŒํ˜•

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.

  • void BSTMakeAndInit(BTreeNode **pRoot)
  • BSTData BSTGetNodeData(BTreeNode *bst);
  • void BSTInsert(BTreeNode **pRoot, BSTData data);
  • BTreeNode *BSTSearch(BTreeNode *bst, BSTData target);

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ์‚ฝ์ž…๊ณผ ํƒ์ƒ‰

์‚ฝ์ž… ํ• ๋•Œ๋Š” ๊ธฐ์กด์˜ ๊ทœ์น™์— ๋งž๊ฒŒ ๋ฃจํŠธ ๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ์ž‘์œผ๋ฉด ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ, ๋น„๊ต ๋Œ€์ƒ์ด ์—†์„ ๋–„ ๊นŒ์ง€ ๋‚ด๋ ค๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋น„๊ต๋Œ€์ƒ์ด ์—†๋Š” ์œ„์น˜๊ฐ€ ์ƒˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ์œ„์น˜์ด๋‹ค.

ํƒ์ƒ‰๋„ ๊ฐ™๋‹ค. target์— ๊ธฐ์ค€์— ๋งž๋Š” ๊ฐ’์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ์ค€์— ๋งŸ์ถฐ ์œ„์น˜๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค.

target == 11

11 > 10 → ์˜ค๋ฅธ์ชฝ

11 < 13 → ์™ผ์ชฝ

์ด์ง„ ํŠธ๋ฆฌ์˜ ์‚ญ์ œ

 

์ด์ง„ํŠธ๋ฆฌ์˜ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ 3๊ฐ€์ง€ ์ƒํ™ฉ์ด ์žˆ๋‹ค.

  • ์‚ญ์ œ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
  • ์‚ญ์ œ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ์˜ ์ž์‹๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ
  • ์‚ญ์ œ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ

์‚ญ์ œ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ ์‚ญ์ œ ํ•˜๋ฉด๋œ๋‹ค.

์‚ญ์ œ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ

์‚ญ์ œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ ๋…ธ๋“œ๋ฅผ ๋Œ€์ฒด ํ•˜๋ฉด๋œ๋‹ค.

๋งˆ์ง€๋ง‰ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ์‚ญ์ œ ๋…ธ๋“œ์˜ ์ž๋ฆฌ๋ฅผ ๋Œ€์ฒด ํ•ด์•ผํ• ๊นŒ์— ๋Œ€ํ•œ ๋งŽ์€ ์ƒ๊ฐ์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ.

  • ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์ค‘ ๊ฐ€์žฅ ์ž‘์€ (ํฐ)์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์ฒด ํ•œ๋‹ค.

2๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณธ๋‹ค.

์‚ญ์ œ ๋…ธ๋“œ์ธ 13์˜ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์€ 15์ด๋‹ค.

15์˜ ๊ฐ’์œผ๋กœ 13์˜ ์œ„์น˜๋ฅผ ๋Œ€์‹ ํ•ด๋ณด๋ฉด. ์ด์ง„ ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 3๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๋ฐŸ์•„์•ผ ํ•œ๋‹ค.

  • ๋‹จ๊ณ„ 1 → ์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ๋Œ€์ฒดํ•  ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค
  • ๋‹จ๊ณ„ 2 →๋Œ€์ฒดํ•  ๋…ธ๋“œ์— ์ €์žฅ๋œ ๊ฐ’์„ ์‚ญ์ œํ•  ๋…ธ๋“œ์— ๋Œ€์ž…ํ•œ๋‹ค.
  • ๋‹จ๊ณ„ 3 → ๋Œ€์ฒดํ•  ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •

// cNode๋Š” ์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
// pNode๋Š” ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
while (cNode != NULL && GetData(cNode) != target)
    {
        pNode = cNode;
        if (GetData(cNode) > target)
        {
            cNode = GetLeftSubTree(cNode);
        }
        else
            cNode = GetRightSubTree(cNode);
    }

ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์ด ์•„๋‹๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ์‹คํ–‰ ์‹œํ‚จ๋‹ค.

๋‹จ๊ณ„1

// mNode๋Š” ๋Œ€์ฒดํ•  ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
// mpNode๋Š” ๋Œ€์ฒดํ•  ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
BTreeNode *mNode = GetRightSubTree(dNode);
BTreeNode *mpNode;
int delData;

while (GetLeftSubTree(mNode) != NULL)
{
			mpNode = mNode;
			mNode = GetLeftSubTree(mNode);
}

์œ„์˜ ์˜ˆ์‹œ์—์„œ ๋ณด๋ฉด mNode๋Š” 15 mpNode๋Š” 13์„ ๊ฐ€๋ฅดํ‚จ๋‹ค.

๋‹จ๊ณ„2

//dNode๋Š” ์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
delData = GetData(dNode);
SetData(dNode, GetData(mNode));

๋‹จ๊ณ„3

if (GetLeftSubTree(mpNode) == mNode)
         ChangeLeftSubTree(mpNode, GetRightSubTree(mNode));
else
         ChangeRightSubTree(mpNode, GetRightSubTree(mNode));

์ž์‹ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

์œ„์˜ ๊ฒฝ์šฐ๋Š”else์— ํ•ด๋‹น ํ•œ๋‹ค.

ChangeRightSubTree(mpNode, GetRightSubTree(mNode));

mpNode(13) GetRightSubTree(mNode)(16)์„ ์—ฐ๊ฒฐํ•œ๋‹ค.