์ด์ง ํ์ ํธ๋ฆฌ
์ด์งํ์ ํธ๋ฆฌ๋ ์ด์งํธ๋ฆฌ์ ์ผ์ข ์ด๋ค.
์ด์ง ํ์ํธ๋ฆฌ๋ ์ ์ฅ ํ ๋ ํ์น์ด ์๋ค.
- ์์ง ํ์ ํธ๋ฆฌ์ ๋ ธ๋์ ์ ์ฅ๋ ํค๋ ์ ์ผํ๋ค.
- ๋ฃจํธ ๋ ธ๋์ ํค๊ฐ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ด๋ ํ ๋ ธ๋์ ํค๋ณด๋ค ํฌ๋ค.
- ๋ฃจํธ ๋ ธ๋์ ํค๊ฐ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ด๋ ํ ๋ ธ๋์ ํค๋ณด๋ค ์๋ค.
์ด๋ฐ ์์ผ๋ก ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ค์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๊ฐ์ ํ์ ํ ๋, ๊ธธ์ ์์ ์ผ์ด ์์ ๊ฒ์ด๋ค.
์ผ์ชฝ ์์ ๋ ธ๋์ ํค < ๋ถ๋ชจ ๋ ธ๋์ ํค < ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ํค
์ด์ง ํ์ํธ๋ฆฌ์ ์ถ์ ์๋ฃํ
์ด์ง ํ์ ํธ๋ฆฌ์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
- 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)์ ์ฐ๊ฒฐํ๋ค.