Live Today
[์๋ฃ๊ตฌ์กฐ] Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ) ๋ณธ๋ฌธ
[์๋ฃ๊ตฌ์กฐ] Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ)
ilivetoday 2022. 8. 30. 18:10๐ ๋ชฉ์ฐจ
- Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ)๋?
- Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ)์ 4๊ฐ์ง ์กฐ๊ฑด
- Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ) ์ฐ์ฐ
- ํ์ ์ฐ์ฐ
- ์ฝ์ ์ฐ์ฐ
- ์ญ์ ์ฐ์ฐ
- Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ) ์ฑ๋ฅ
1๏ธโฃ Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ)๋?
- ์ด์งํ์ํธ๋ฆฌ(BST: Binary Search Tree)๋ ์ด์งํธ๋ฆฌ ๊ธฐ๋ฐ์ ํ์์ ์ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- ์ด์งํ์์ ํจ์จ์ ์ธ ํ์ ๋ฅ๋ ฅ์ ๊ฐ์ง๋ฉฐ, ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด ํน์ง์ด๋ค.
- ์์ ์ด์ง ํ์ ํธ๋ฆฌ์์, 15์ ๊ฐ์ ๊ฐ์ง ๋ ธ๋์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๊ฐ๋ค(5,7,10)์ ๋ฃจํธ ๋ ธ๋์ธ 15๋ณด๋ค ๋ชจ๋ ์๊ณ , ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๊ฐ๋ค(16, 18, 19, 20)์ ๋ชจ๋ 15๋ณด๋ค ํฐ ๊ฐ๋ค์ด๋ค.
- ์ด์ง ํ์ ํธ๋ฆฌ๋ฅผ ์ค์ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ํํ๋ฉด, 5 -> 7 -> 10 -> 15 -> 16 -> 18 -> 19 -> 20 -> 22 -> 36 -> 45 ->60 ์ผ๋ก ์ซ์๋ค์ ํฌ๊ธฐ ์์ด๋ค.
โ๏ธ ์ด์งํ์ํธ๋ฆฌ์ ๋ชฉ์ ์?
์ด์งํ์ + ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ด์งํ์ : ํ์์ ์์๋๋ ์๊ฐ๋ณต์ก๋๋ O(logN), but ์ฝ์ ,์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅ
- ์ฐ๊ฒฐ๋ฆฌ์คํธ : ์ฝ์ , ์ญ์ ์ ์๊ฐ๋ณต์ก๋๋ O(1), but ํ์ํ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(N)
- ์ด ๋๊ฐ์ง๋ฅผ ํฉํ์ฌ ์ฅ์ ์ ๋ชจ๋ ์ป๋ ๊ฒ์ด '์ด์งํ์ํธ๋ฆฌ'
- ์ฆ, ํจ์จ์ ์ธ ํ์ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ , ์๋ฃ์ ์ฝ์ ์ญ์ ๋ ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค.
2๏ธโฃ Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ)์ 4๊ฐ์ง ์กฐ๊ฑด
- ๋ชจ๋ ๋
ธ๋๋ ์ ์ผํ ํค๋ฅผ ๊ฐ๋๋ค. (์ค๋ณต๋ ๊ฐ์ ๊ฐ์ ธ์๋ ์๋๋ค.)
- ์ค๋ณต์ด ์์ด์ผ ํ๋ ์ด์ ๋?
- ๊ฒ์ ๋ชฉ์ ์๋ฃ๊ตฌ์กฐ์ธ๋ฐ, ๊ตณ์ด ์ค๋ณต์ด ๋ง์ ๊ฒฝ์ฐ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ์๋๋ฅผ ๋๋ฆฌ๊ฒ ํ ํ์๊ฐ ์์. (ํธ๋ฆฌ์ ์ฝ์ ํ๋ ๊ฒ๋ณด๋ค, ๋ ธ๋์ count ๊ฐ์ ๊ฐ์ง๊ฒ ํ์ฌ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํจ์ฌ ํจ์จ์ )
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์กด์ฌํ๋ ๋ ธ๋๋ค์ ๊ฐ์ ๊ทธ ํธ๋ฆฌ์ ๋ฃจํธ ๊ฐ๋ณด๋ค ๋ฐ๋์ ์๋ค.
- ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์กด์ฌํ๋ ๋ ธ๋๋ค์ ๊ฐ์ ๊ทธ ํธ๋ฆฌ์ ๋ฃจํธ ๊ฐ๋ณด๋ค ๋ฐ๋์ ํฌ๋ค.
- ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ ์ด์งํ์ํธ๋ฆฌ์ด๋ค.
3๏ธโฃ Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ)์ ์ฐ์ฐ
โ๏ธ ๋ ธ๋ ํด๋์ค ๋ง๋ค๊ธฐ
BST์ ๊ฐ๋ณ ๋
ธ๋๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด ๋ฐ๋ก Node
ํด๋์ค์ด๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ ํ๋๋ก ๊ตฌ์ฑ๋๋ค.
- data : ๋ ธ๋๊ฐ ๊ฐ๋ ์ค์ง์ ๋ฐ์ดํฐ
- left : ๋ ธ๋์ ์ผ์ชฝ ์์
- right : ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์
- ์๋ ์ฝ๋๋ ๋ ธ๋์ ์์ฑ์์ getter/setter ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ํด๋์ค์ด๋ค.
public class BinarySearchTree {
public class Node {
public Node root;
private int data;
private Node left;
private Node right;
/* ์์ฑ์ */
public Node(int data){
this.setData(data);
setLeft(null);
setRight(null);
}
/* ๊ฐ์ข
getter / setter */
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
/*ํ์ ์ฐ์ฐ*/
public boolean find(int key){
Node currentNode = root;
}
}
public Node root; // bst์ ๋ฃจํธ ๋
ธ๋
public BinarySearchTree(){ // bst ์์ฑ์
root = null;
}
}
๐น ํ์ ์ฐ์ฐ
ํ์์ฐ์ฐ์์ ์ค์ํ ์ ์, ๋ฐ๋ก BST์ ํน์ฑ(์ผ์ชฝ ์์ ๋ ธ๋์ ๊ฐ์ ํ์ฌ ๋ ธ๋๋ณด๋ค ํญ์ ์์์ผํ๋ค)๊ณผ (์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ๊ฐ์ ํ์ฌ ๋ ธ๋์ ๊ฐ ๋ณด๋ค ํญ์ ์ปค์ผ ํ๋ค.)๋ผ๋ ํน์ง์ ๋ง์กฑํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ฐ์ฐ์ ํ๋ค๋ ๊ฒ์ด๋ค.
/*ํ์ ์ฐ์ฐ*/
public boolean find(int key){
Node currentNode = root;
while(currentNode != null){
// ํ์ฌ ๋
ธ๋์ ์ฐพ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด
if(currentNode.getData() == key){
return true;
}else if(currentNode.getData() > key){ // ์ฐพ๋ ๊ฐ์ด ํ์ฌ ๋
ธ๋๋ณด๋ค ์์ผ๋ฉด
currentNode = currentNode.left;
}else {// ์ฐพ๋ ๊ฐ์ด ํ์ฌ ๋
ธ๋๋ณด๋ค ํฌ๋ฉด
currentNode = currentNode.right;
}
}
return false;
}
๐น ์ฝ์ ์ฐ์ฐ
์ฝ์ ์ฐ์ฐ์์ ๊ฐ์ฅ ๋จผ์ ํ๋ ์ผ์ root๋ ธ๋๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
root๋
ธ๋๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฆฌ๋ ํด๋น ํธ๋ฆฌ์ ๋
ธ๋๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก ์๋ก์ด newNode
๋ฅผ root๋
ธ๋๋ก ๋ง๋ค์ด์ฃผ๊ณ return์ ํ๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด ๋ ธ๋์ ๊ฐ์ ๋น๊ตํด์ ํด ๋์ ์์ ๋ ์๋ก ๋น๊ตํ ๋ค, ์๋ฆฌ์ ์๋ง๋ ๋ ธ๋์ ์ฝ์ ํ๋ฉด ๋๋ค.
/*์ฝ์
์ฐ์ฐ*/
public void insert(int data) {
Node newNode = new Node(data); // ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๊ฐ null ์ด๋ฉฐ data ์ ๊ฐ์ด ์ ์ฅ๋ ์ ๋
ธ๋ ์์ฑ
if(root == null){// ๋ฃจํธ ๋
ธ๋๊ฐ ์์๋, ์ฆ ํธ๋ฆฌ๊ฐ ๋น์ด์๋ ์ํ์ผ ๋,
root = newNode;
return;
}
Node currentNode = root;
Node parentNode = null;
while(true) {
parentNode = currentNode;
if(data < currentNode.getData()) { // ํด๋น ๋
ธ๋๋ณด๋ค ํด ๋.
currentNode = currentNode.getLeft();
if(currentNode == null) { // ๋ ์ด์ ์์ ๋
ธ๋๊ฐ ์์ ๋, ์ฆ ์ฝ์
ํ ์ ์๋ ๋
parentNode.setLeft(newNode);
return ;
}
}else { // ํด๋น ๋
ธ๋๋ณด๋ค ์์ ๋.
currentNode = currentNode.getRight();
if(currentNode == null){ // ๋ ์ด์ ์์ ๋
ธ๋๊ฐ ์์ ๋, ์ฆ ์ฝ์
ํ ์ ์๋ ๋
parentNode.setRight(newNode);
return ;
}
}
}
}
๐น ์ญ์ ์ฐ์ฐ
์ญ์ ์ฐ์ฐ์ ์กฐ๊ธ ๊น๋ค๋ก์ด ๋ถ๋ถ์ด ์๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง์ฝ ์์์ด ๋ชจ๋ ์๋ ํธ๋ฆฌ์ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ค๊ณ ํ๋ค๋ฉด, ์ญ์ ํ ๋ ธ๋์ ์์๋ค์ ์ด๋ค ์์์ ์ํด ๋ฐฐ์น๋ ๊น?
์ด๊ฒ์ด ๋ชจํธํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ญ์ ์ฐ์ฐ์์ ์ผ์ด์ค๋ฅผ ๋๋ ์ ์ฐ์ฐ์ ํ๋ค. ์ผ์ด์ค๋ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
- ์์ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
- ํ๋์ ์์ ๋ ธ๋๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ
- ๋๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ
์ญ์ ์ฐ์ฐ ๊ธฐ๋ณธ ์ธํ
/*์ญ์ ์ฐ์ฐ*/
public boolean delete(int data){
Node parentNode = root;
Node currentNode = root;
boolean isLeftChild = false;
while(currentNode.getData() != data) {
parentNode = currentNode;
if(currentNode.getData() > data) {
isLeftChild = true;
currentNode = currentNode.getLeft();
}else {
isLeftChild = false;
currentNode = currentNode.getRight();
}
if(currentNode == null){
return false;
}
}
if(currentNode.getLeft() == null && currentNode.getRight() == null) { // 1. ์์ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
if(currentNode == root) {
root = null; // ํด๋น ๋
ธ๋๊ฐ root node์ผ ๊ฒฝ์ฐ
}
if(isLeftChild) {
parentNode.setLeft(null); // ์ญ์ ํ ๋
ธ๋๊ฐ ๋ถ๋ชจ ๋
ธ๋์ ์ผ์ชฝ ์์์ผ ๊ฒฝ์ฐ
}
else {
parentNode.setRight(null); // ์ญ์ ํ ๋
ธ๋๊ฐ ๋ถ๋ชจ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ์์์ผ ๊ฒฝ์ฐ
}
} else if(currentNode.getRight() == null){ // 2-1. ์์ ๋
ธ๋๊ฐ ํ๋์ธ ๊ฒฝ์ฐ(์ค๋ฅธ์ชฝ ์์์ด ์์ ๋)
parentNode.setLeft(currentNode.getLeft());
} else if(currentNode.getLeft() == null) { // 2-2. ์์ ๋
ธ๋๊ฐ ํ๋์ธ ๊ฒฝ์ฐ(์ผ์ชฝ ์์์ด ์์ ๋)
parentNode.setRight(currentNode.getRight());
} else { // 3. ์์์ด ๋์ธ ๊ฒฝ์ฐ
Node minimum = getMinumun(currentNode);
if(currentNode == root) {
root = minimum;
}else if (isLeftChild){
parentNode.setLeft(minimum);
}else {
parentNode.setLeft(currentNode.getLeft());
}
minimum.setLeft(currentNode.getLeft());
}
return false;
}
Node getMinumun(Node deleteNode) {
Node minimum = null;
Node minimumParent = null;
Node currentNode = deleteNode.getRight();
while(currentNode != null) {
minimumParent = minimum;
minimum = minimumParent;
currentNode = currentNode.getLeft();
}
if(minimum != deleteNode.getRight()){
minimumParent.setLeft(minimum.getRight());
minimum.setRight(deleteNode.getRight());
}
return minimum;
}
4๏ธโฃ Binary Search Tree(์ด์ง ํ์ ํธ๋ฆฌ) ์ฑ๋ฅ
์ด์งํ์ํธ๋ฆฌ๋ ์ด์ง ํ์์ ์ํ ํธ๋ฆฌ๋ค. ๋ฃจํธ๋ ธ๋๋ฅผ ํฌํจํด์, ๋ถ๋ชจ ๋ ธ๋๊ฐ ์ผ์ชฝ์ ์์ ๊ฐ์ ์์์, ์ค๋ฅธ์ชฝ์๋ ํฐ ๊ฐ์ ์์์ ๊ฐ์ง๋ ๊ตฌ์กฐ๋ค. ๊ฒ์ํ ๋ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๋ณด๊ณ ๋ถ๋ชจ๋ณด๋ค ์์ ๊ฐ์ ์ฐพ๊ณ ์๋ค๋ฉด ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ํ์ํ๊ณ ํฐ ๊ฐ์ ์ฐพ๊ณ ์๋ค๋ฉด ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ํ์ํ๋ฉด ๋๋ค. ๊ฐ ๋จ๊ณ๋ง๋ค ํด์ผ๋๋ ์์ ์ด ๋ฐ์ ๋ก ์ค์ด๋๋ O(log n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
์ด์ง ํธ๋ฆฌ๋ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๊ท ํ์ด ๋ง์์ผ ์ฑ๋ฅ์ด ๋ณด์ฅ๋๋ค. ํ์ชฝ์ผ๋ก ๋๋ฌด ์น์ฐ์ณ์ ธ ์์ผ๋ฉด O(n) ์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค. ์ด๋ฐ ์ด์๋ก ์ด์งํธ๋ฆฌ๋ฅผ ๊ท ํ์กํ๊ฒ ํ๋๋ก ๋ง๋ ํธ๋ฆฌ๊ฐ ์๋๋ฐ, ๋ฐ๋ก ๐ AVL tree ์ Red-Black tree ์ด๋ค. (AVL tree ์ Red-Black tree์ ๊ดํ ๋ด์ฉ์ 3์ฃผ ๋ค์ ๊ณต๋ถํ ์์ ์ ๋๋ค..ใ ใ )
โ๏ธ ์๊ฐ ๋ณต์ก๋
- ๊ท ํ ํธ๋ฆฌ : ๋ ธ๋ ๊ฐ์๊ฐ N๊ฐ์ผ ๋ O(logN)
- ํธํฅ ํธ๋ฆฌ : ๋ ธ๋ ๊ฐ์๊ฐ N๊ฐ์ผ ๋ O(N)
- ํธํฅ ์ด์ง ํธ๋ฆฌ(Skewed Binary Tree)์ ํ์ํ ๋
๐(๐)
์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ - ์ด์ง ํ์ ํธ๋ฆฌ๋ ์ต๋ํ ์์ ์ด์ง ํธ๋ฆฌ์ ํํ๋ฅผ ์ ์งํ ์ ์๋๋ก ํด์ผํ๋ค.
๐ ์ฐธ๊ณ ๋งํฌ
์ด์ง ํ์ ํธ๋ฆฌ(Binary Search Tree)๊ฐ๋ ๋ฐ Java ๊ตฌํ
[์๋ฃ๊ตฌ์กฐ] ์ด์ง ํ์ ํธ๋ฆฌ(Binary Search Tree)์ ์ ์, ๋ ธ๋ ํ์, ์ฝ์ , ์ญ์
20. ์ด์ง ํ์ ํธ๋ฆฌ(Binary Search Tree)
์ด์งํ์ํธ๋ฆฌ (Binary Search Tree) | ๐จ๐ป๐ป Tech Interview
'Computer Science > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] Trie(ํธ๋ผ์ด) (1) | 2022.10.03 |
---|---|
[์๋ฃ๊ตฌ์กฐ] B-Tree & B+ Tree (3) | 2022.09.19 |
[์๋ฃ๊ตฌ์กฐ] Array & ArrayList & LinkedList (6) | 2022.08.15 |
[์๋ฃ๊ตฌ์กฐ] Stack & Queue & Map & Set (6) | 2022.08.07 |