๐ฉ๐ป Binary search ree๋?
์ด์ง ํ์ ํธ๋ฆฌ๋ ์๋์ ๊ท์น์ผ๋ก ๊ตฌ์ฑ๋ ์ด์ง ํธ๋ฆฌ์ด๋ค.
- ์ผ์ซ ์์ ๋ ธ๋์ ํค๋ ๋ถ๋ชจ ๋ ธ๋์ ํค ๋ณด๋ค ์์
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ํค๋ ๋ถ๋ชจ ๋ ธ๋์ ํค๋ณด๋ค ํผ
- ๊ฐ๊ฐ์ ์๋ธ ํธ๋ฆฌ๋ ์ด์ง ํ์ ํธ๋ฆฌ๋ฅผ ์ ์ง
- ์ค๋ณต๋ ํค๋ฅผ ํ์ฉํ์ง ์์
โ๏ธ ์ด์ง ํ์ ํธ๋ฆฌ์ ํน์ง
- ์ด์ง ํ์ ํธ๋ฆฌ ๊ท์น์ ์ํด ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋จ
- ์ด์ง ํธ๋ฆฌ์ ๋นํด ํ์์ด ๋น ๋ฆ (๊ท ํ ์ ์ง ํ์)
- ๊ท ํ ์ํ : O(logN)
- ๋ถ๊ท ํ ์ํ : O(N)
โ๏ธ ํ์
- ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃจํธ ๋ ธ๋๋ถํฐ ๋น๊ต ์์
- ๋์ ๋น๊ต๋ฅผ ํ์ฌ ์ฐพ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ผ์ชฝ, ํฌ๋ฉด ์ค๋ฅธ์ชฝ ๋ ธ๋๋ก ์ด๋
- ์ฐพ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด null ๋ฐํ
- ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ผ๋ ์ต๋ ํธ๋ฆฌ ๋์ด ๋งํผ์ ํ์์ด ์ด๋ฃจ์ด์ง
โ๏ธ ์ฝ์
- Root ๋ถํฐ ๋น๊ต ์์ (์ค๋ณต ํค ๋ฐ๊ฒฌ ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ์ข ๋ฃ)
- ์ฝ์ ํ ํค๊ฐ ํ์ฌ ๋ ธ๋์ ํค๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ์ผ๋ก ์ด๋
- ์ฝ์ ํ ํค๊ฐ ํ์ฌ ๋ ธ๋์ ํค๋ณด๋ค ํฌ๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
- Leaf ๋ ธ๋์ ๋๋ฌ ํ ํค ๋น๊ตํ์ฌ ์์ผ๋ฉด ์ผ์ชฝ, ํฌ๋ฉด ์ค๋ฅธ์ชฝ์ ์ฝ์
โ๏ธ ์ญ์
- ์ญ์ ๋์ ๋
ธ๋๊ฐ Leaf ๋
ธ๋์ธ ๊ฒฝ์ฐ
- ์ญ์ ๋์ ๋ ธ๋ ์ญ์
- ๋ถ๋ชจ ๋ ธ๋์ ํด๋น ์์ ๋งํฌ null๋ก ๋ณ๊ฒฝ
- ์ญ์ ๋์ ๋
ธ๋์ ์์ ๋
ธ๋๊ฐ ํ๋ ์๋ ๊ฒฝ์ฐ
- ์์ ๋ ธ๋๋ฅผ ์ญ์ ๋์ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋์ ์ฐ๊ฒฐ
- ์ญ์ ๋์ ๋ ธ๋ ์ญ์
- ์ญ์ ๋์ ๋
ธ๋์ ์์ ๋
ธ๋๊ฐ ๋์ธ ๊ฒฝ์ฐ
- ๋
ธ๋ ์ ํ
- ๋ฐฉ๋ฒ1) ์ญ์ ๋์ ๋ ธ๋์ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์์ ๊ฐ์ฅ ํฐ ๋ ธ๋ ์ ํ
- ๋ฐฉ๋ฒ2) ์ญ์ ๋์ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๋ ธ๋ ์ ํ
- ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ์ ํํ ๋ ธ๋๋ฅผ ์ญ์ ๋์ ๋ ธ๋ ์์น๋ก ์ฌ๋ฆผ (**์ด์ง ํ์ ํธ๋ฆฌ์ ํน์ฑ ์ ์ง๋ฅผ ์ํด)
- ์๋ก ์ฌ๋ฆฌ๋ ๊ณผ์ ์์ ๋ค๋ฅธ ์์ ๋ ธ๋๋ค์ ๋งํฌ ์ฐ๊ฒฐ ์์ ์งํ
- ์ญ์ ๋์ ๋ ธ๋ ์ญ์
- ๋
ธ๋ ์ ํ
โ๏ธ ์ด์ง ํ์ ํธ๋ฆฌ ์ฝ๋ ๊ตฌํ
1) ๊ธฐ๋ณธ ๊ตฌํ
package algorithmBasic.tree;
class Node{
int key;
Node left;
Node right;
Node(int key, Node left, Node right){
this.key = key;
this.left = left;
this.right = right;
}
}
public class BinarySearchTree {
Node head;
BinarySearchTree(int key){
this.head = new Node(key, null, null);
}
public void addNode(int key){
if(this.head == null){
this.head = new Node(key, null, null);
}else{
Node cur = this.head;
while(true){
Node pre = cur;
if(key < cur.key) {
cur = cur.left;
if (cur == null) {
pre.left = new Node(key, null, null);
break;
}
}
else{
cur = cur.right;
if(cur == null){
pre.right = new Node(key, null, null);
break;
}
}
}
}
}
public void removeNoe(int key){
Node parent = null;
Node successor = null;
Node predecessor = null;
Node child = null;
Node cur = this.head;
while(cur != null){
if(key == cur.key){
break;
}
parent = cur; //cur์์น ๋ณํ ์์ ์์ผ๋ฏ๋ก ์ข
๋ฃ์ cur์ ๋ถ๋ชจ๋
ธ๋๋ฅผ ๊ฐ์ง๋ค.
if(key < cur.key){
cur = cur.left;
}else{
cur = cur.right;
}
}
if(cur == null){
System.out.println("key์ ํด๋นํ๋ ๋
ธ๋๊ฐ ์์ต๋๋ค.");
return;
}
// Leaf ๋
ธ๋ ์ธ ๊ฒฝ์ฐ
if(cur.left == null && cur.right == null){
if(parent == null){ // ์ฌ์ค์ ํธ๋ฆฌ์ ๋
ธ๋๊ฐ ํ ๊ฐ์ธ ์ผ์ด์ค
this.head = null;
}else{
if(parent.left == cur){
parent.left = null;
}else{
parent.right = null;
}
}
}
// ์์ ๋
ธ๋๊ฐ ํ ๊ฐ์ธ ๊ฒฝ์ฐ
else if((cur.left != null && cur.right == null)
|| (cur.left == null && cur.right != null)){
if(cur.left != null){
child = cur.left;
}else{
child = cur.right;
}
if(parent == null){ // cur์ด ๋ฃจํธ๋
ธ๋์ด๊ณ , ๋ฃจํธ๋
ธ๋์ ์์์ด ํ๋ ์๋ ๊ฒฝ์ฐ
this.head = child;
}else{
if(parent.left == cur){
parent.left = child;
}else{
parent.right = child;
}
}
}
// ์์ ๋
ธ๋๊ฐ ๋ ์ธ ๊ฒฝ์ฐ (์ ์ผ ๋ณต์กํ)
else{
predecessor = cur;
successor = cur.left; // ์ญ์ ๋์ ๋
ธ๋๊ธฐ์ค ์ผ์ชฝ์์ ์ ์ผ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฒ ๋นผ์ค๊ธฐ
while(successor.right != null){
predecessor = successor;
successor = successor.right;
}
predecessor.right = successor.left;
successor.left = cur.left;
successor.right = cur.right;
if(parent == null){
this.head = successor;
}else{
if(parent.left == cur){
parent.left = successor;
}else{
parent.right = successor;
}
}
}
}
}
2) ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ ์ฝ๋ ๊ตฌํ
package algorithmBasic.tree;
public class BinarySearchTree2 {
Node head;
BinarySearchTree2(int key){
this.head = new Node(key, null, null);
}
public Node addNodeRecursive(Node cur, int key){
if(cur == null){
return new Node(key, null, null);
}
if(key < cur.key){
cur.left = addNodeRecursive(cur.left, key);
}else{
cur.right = addNodeRecursive(cur.right, key);
}
return cur;
}
public Node removeNodeRecursive(Node cur, int key){
if(cur == null){
return null;
}
if(key < cur.key){
cur.left = removeNodeRecursive(cur.left, key);
}else if(key > cur.key){
cur.right = removeNodeRecursive(cur.right, key);
}else{
if(cur.left == null){ // ์์๋
ธ๋๊ฐ ํ๋ ์๊ฑฐ๋, ์๋ ๊ฒฝ์ฐ
return cur.right;
}else if(cur.right == null){
return cur.left;
}else{
Node predecessor = cur;
Node successor = cur.left;
while(successor.right != null){
predecessor = successor;
successor = successor.right;
}
predecessor.right = successor.left;
cur.key = successor.key;
}
}
return cur;
}
// levelOrder : Queue ์ด์ฉํด์ ์ถ๋ ฅ
}
'์๊ณ ๋ฆฌ์ฆ > ์๋ฃ๊ตฌ์กฐ ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ทธ๋ํ - ๋น์ ํ ์๋ฃ๊ตฌ์กฐ (0) | 2024.07.16 |
---|---|
๊ท ํ ์ด์ง ํธ๋ฆฌ (by ์ด์ง ํ์ ํธ๋ฆฌ) (0) | 2024.07.12 |
java - ๋นํธ ์ฐ์ฐ์ (0) | 2024.06.26 |
์๋ฃ๊ตฌ์กฐ ๋ชฉ๋ก (+java์์์ ์ฌ์ฉ) (0) | 2024.06.25 |
ํ(Heap) - ์๋ฃ๊ตฌ์กฐ (0) | 2024.06.22 |