Contents
- 1. Tree ๊ธฐ๋ณธ ๊ฐ๋ ๋ค
- 2. Binary Tree
- 3. Binray Tree ์ ํํ
- 4. Binary Tree Traversal
- 5. Binary Search Trees (์ฐ๋ฆฌ๋ง๋ก ์ด์ง ํ์ ํธ๋ฆฌ)
- 6. Insert x
- 7. Delete x(์๊ฑด ์ชผ๊ธ ๋ณต์กํจ)
- 8. Tree์ ๊ด๋ จ๋ ์ฐ์ฐ ๋ช๊ฐ์ง(Cross Reference ํ ๋ ํ๋๊ฑฐ ์ฝ๊ฐ ๋ณํ์์ผฐ์. C++์์ผ๋ก๋ ๋์ค์-.-)
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 -> ๋ด๋ฆผ
- Left Child : ์ธ๋ฑ์ค * 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, ์ ๋ ฌ๋์ด ์์ง ์์ผ๋ฉด ์ด์ง ํ์ ๋๋ฌด๋ ๋ญ๋ ์๋ฉ๋๋ค. ์๋์จ๋จ ๋ง์
๋๋ค. ์ค๊ฐ์ ๊ผฌ์ด๋๋ฐ ๋ฌด์จ..--;
- ์ผ๋ฐ ํ์ : ฮธ(n)
- ์กฐ๊ฑด
- Binray Search Tree ๋๊น ๋น์ฐํ Binary Tree ์ฌ์ผ ํ๋ค.
- Keys in Left Subtree < Keys of Node
- Keys in Right Subtree > Keys of Node(๊ณ ๋ก ์์๋๋ก ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋จ ๋ง์
๋๋ค.)
- Binray Search Tree ๋๊น ๋น์ฐํ Binary Tree ์ฌ์ผ ํ๋ค.
- ์๊ณ ๋ฆฌ์ฆ
- 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๋ก ์
ํ
. ๊ฑฐ๊ธฐ์๋ถํฐ ๊ฒ์ ๋ค์ ์์
- if x = Root's Key then ์ฐพ์์ผ๋๊น ์๊ณ ๋ฆฌ์ฆ ๋
- Search x => Compare with 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 ์์ผ๋ฉด - ๊ทธ ๋ฐ์ ๋
ธ๋๋ค์ ํ๋จ๊ณ ์๋ก.. ๊ณ ๋ก ํ ์๋ฒ์ง์ ์์
- y๊ฐ Child ์์ผ๋ฉด - ๊ทธ๋ฅ ์ง์ด๋ค.
- ๋ง์ฝ x๊ฐ leaf(๋งจ ๋ ๋
ธ๋) - ๊ทธ๋ฅ ์ง์ฐ๋ฉด ๋์ง ๋ญ..--;
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; }