๐ Binary Tree
๐ Binary Tree(์ด์ง ํธ๋ฆฌ)
- ๊ฐ ๋ ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์๋ ํธ๋ฆฌ ๊ตฌ์กฐ
๐ ์ด์ง ํธ๋ฆฌ์ ๊ธฐ๋ณธ ๊ฐ๋
- ๋
ธ๋(Node)
- ๊ฐ(val) : ๋ ธ๋์ ์ ์ฅ๋ ๋ฐ์ดํฐ
- ์ผ์ชฝ ์์(left) : ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- ์ค๋ฅธ์ชฝ ์์(right) : ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- ์ฃผ์ ์ฉ์ด
- ๋ฃจํธ(root) : ํธ๋ฆฌ์ ์์์ (์ต์์ ๋ ธ๋)
- ๋ถ๋ชจ(parent) : ํน์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ ๋ ธ๋
- ์์(child) : ๋ถ๋ชจ ๋ ธ๋์์ ์ฐ๊ฒฐ๋ ํ์ ๋ ธ๋
- ๋ฆฌํ(leaf) : ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์์ด ์๋ ๋ ธ๋
- ๊น์ด(depth) : ๋ฃจํธ์์ ํน์ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ
- ๋์ด(height) : ํน์ ๋ ธ๋์์ ๊ฐ์ฅ ๊น์ ๋ฆฌํ๊น์ง์ ๊ฑฐ๋ฆฌ
๐ป C++์์ ์ด์ง ํธ๋ฆฌ ๊ตฌํ
- ๋ณดํต ๊ตฌ์กฐ์ฒด(struct) ๋๋ ํด๋์ค(class)๋ก ๊ตฌํํ๋ค.
๐ ์ด์ง ํธ๋ฆฌ์ ๋ ธ๋ ๊ตฌ์กฐ
#include <iostream>
using namespace std;
// ์ด์ง ํธ๋ฆฌ ๋
ธ๋ ์ ์
struct TreeNode {
int val; // ๋
ธ๋์ ๊ฐ
TreeNode* left; // ์ผ์ชฝ ์์
TreeNode* right; // ์ค๋ฅธ์ชฝ ์์
// ๊ธฐ๋ณธ ์์ฑ์
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
๐ ์ด์ง ํธ๋ฆฌ ์์ฑํด๋ณด๊ธฐ
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
int main() {
// ๋
ธ๋ ์์ฑ
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
return 0;
}
- TreeNode์ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ ๋ค์ ๋ฃจํธ ๋ ธ๋์ ๊ทธ ์์๋ค์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ฉดโฆ
1
/ \
2 3
/ \
4 5
- ์ต์ข ์ ์ผ๋ก ์์ ์ฝ๋๋ก ๋ง๋ ์ด์ง ํธ๋ฆฌ๋ ์ด๋ฌํ ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๐ ์ด์ง ํธ๋ฆฌ ์ํ(Tree Traversal)
- ์ด์ง ํธ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์๋ 4๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
- ์ ์ ์ํ(preorder) : root -> left -> right
- ์ค์ ์ํ(inorder) : left -> root -> right
- ํ์ ์ํ(postorder) : left -> right ->root;
- ๋ ๋ฒจ ์ํ(level order) : BFS ๋ฐฉ์(queue ์ฌ์ฉ)
๐ป 4๊ฐ์ง ์ํ ์ฝ๋ ๋ฐฉ๋ฒ
๐ ์ ์ ์ํ
- root -> left -> right ๋ฐฉ๋ฌธ ์์
void preorder(TreeNode* root) {
if(!root) return;
cout << root->val << " "; // ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ
preorder(root->left); // ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ ๋ฐฉ๋ฌธ
preorder(root->right) // ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ ๋ฐฉ๋ฌธ
}
๐ ์ค์ ์ํ
- left -> root -> right ๋ฐฉ๋ฌธ ์์
void inorder(TreeNode* root) {
if(!root) return;
inorder(root->left); //์ผ์ชฝ ์๋ธ ํธ๋ฆฌ ๋ฐฉ๋ฌธ
cout<< root->val << " "; // ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ
inorder(root->right); // ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ ๋ฐฉ๋ฌธ
}
๐ ํ์ ์ํ
- left -> right -> root ๋ฐฉ๋ฌธ ์์
void postorder(TreeNode* root) {
if(!root) return;
postorder(root->left); // ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ ๋ฐฉ๋ฌธ
postorder(root->right); // ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ ๋ฐฉ๋ฌธ
cout<< root->val << " "; // ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ
}
๐ ๋ ๋ฒจ ์ํ(BFS)
- queue๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ๋ ๋ฒจ ๋ ธ๋๋ฅผ ์ ๋ถ ๋ฐฉ๋ฌธํ๋ฉฐ ๋ด๋ ค๊ฐ๋ค.
void BFS(TreeNode* root) {
if(!root) return;
queue(TreeNode*) q;
q.push(root);
while(!q.empty())
{
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
๐ ์ด์ง ํ์ ํธ๋ฆฌ(Binary search Tree, BST)
- ์ผ์ชฝ ์์์ ๋ถ๋ชจ๋ณด๋ค ์๊ณ , ์ค๋ฅธ์ชฝ ์์์ ๋ถ๋ชจ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง๋ ์ด์ง ํธ๋ฆฌ
๐ ์ด์ง ํ์ ํธ๋ฆฌ ์ฝ์
TreeNode* insertBST(TreeNode* root, int val) {
if (!root) return new TreeNode(val);
if (val < root->val)
root->left = insertBST(root->left, val);
else
root->right = insertBST(root->right, val);
return root;
}
๐ ์ด์ง ํ์ ํธ๋ฆฌ ๊ฒ์
- ๊ฐ์ด ๋ ์์์ผํ๋ค๋ฉด ์ผ์ชฝ์ผ๋ก ๋ด๋ ค๊ฐ๋ฉด ๋๊ณ ๊ฐ์ด ๋ ์ปค์ผํ๋ค๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ๋ด๋ ค๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ค.
bool searchBST(TreeNode* root, int val) {
if (!root) return false;
if (root->val == val) return true;
else if (val < root->val) return searchBST(root->left, val);
else return searchBST(root->right, val);
}
๐ ์์ ์ด์ง ํธ๋ฆฌ(Complete Binary Tree)
- ๋ชจ๋ ๋ ๋ฒจ์์ ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋๋ก ๋ ธ๋๊ฐ ์ฑ์์ง ์ด์ง ํธ๋ฆฌ์ด๋ค.
๐ ํน์ง
- ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋๋ก ๋ ธ๋๊ฐ ์ฑ์์ ธ ์์ด์ผ ํ๋ค.
- ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋ชจ๋ ๋ ๋ฒจ์์๋ ๋ ธ๋๊ฐ ๊ฝ ์ฐจ ์์ด์ผํ๋ค.
- ์ผ์ชฝ ์์์ด ์กด์ฌํ์ง ์๋๋ฐ ์ค๋ฅธ์ชฝ ์์์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
๐ ํํ ์์
- ์์ ์ด์ง ํธ๋ฆฌ(O)
1 / \ 2 3 / \ / 4 5 6 - ์์ ์ด์ง ํธ๋ฆฌ(X)
1
/ \
2 3
/ \
4 5 โ (์ผ์ชฝ์ 5๊ฐ ๋จผ์ ์์ผ ํจ)
๐ ์์ ์ด์ง ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์
์์ ์ด์ง ํธ๋ฆฌ ๋ ธ๋ ๊ฐ์ ์ต์ ํ ๋ฌธ์
- ๋ณดํต ์ด์ง ํธ๋ฆฌ์์ ์ผ๋ฐ์ ์ธ ์ฌ๊ท๋ฅผ ์ฌ์ฉํด ์ซ์๋ฅผ ์ธ๋ฉด ์๊ฐ ๋ณต์ก๋๋ O(N) ์ด๋ค.
- ํ์ง๋ง ์์ ์ด์ง ํธ๋ฆฌ ์์๋ ๋์ด ๋น๊ต ์ต์ ํ๋ฅผ ํตํด O((logN)^2) ์ผ๋ก ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์์ ์ด์งํธ๋ฆฌ์ด๊ณ ๋์ด๊ฐ h์ผ ๋ 2^(h+1) - 1 ์ ๊ณต์์ ์ฌ์ฉํ ์ ์๋ค.