Skip to content

Latest commit

ย 

History

History
346 lines (265 loc) ยท 11.6 KB

BinarySearchTree.md

File metadata and controls

346 lines (265 loc) ยท 11.6 KB

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ (BinarySearchTree)

written by sohyeon, hyemin ๐Ÿ’ก


1. ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ (BinarySearchTree)

์ด์ง„ํŠธ๋ฆฌ๊ฐ€ ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

  1. ์–ด๋–ค ๋…ธ๋“œ N์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ๋…ธ๋“œ์˜ ๋ชจ๋“  ํ‚ค ๊ฐ’์€ ๋…ธ๋“œ N์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค.
  2. ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์€ ๋…ธ๋“œN์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค.
  3. ๊ฐ™์€ ํ‚ค ๊ฐ’์„ ๊ฐ–๋Š” ๋…ธ๋“œ๋Š” ์—†๋‹ค.

๊ฐ ๋…ธ๋“œ์— ๊ฐ’์ด ์กด์žฌํ•  ๋•Œ, ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—๋Š” ๊ทธ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์„ ์ง€๋‹Œ ๋…ธ๋“œ๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.
๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—๋Š” ๊ทธ ๋…ธ๋“œ์˜ ๊ฐ’๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํฐ ๊ฐ’๋“ค์„ ์ง€๋‹Œ ๋…ธ๋“œ๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.
์ขŒ์šฐ ํ•˜์œ„ํŠธ๋ฆฌ๋Š” ๊ฐ๊ฐ์ด ๋‹ค์‹œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์ด๋‹ค.

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ์˜ˆ์‹œ

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„ ์ˆœํšŒํ•˜๋ฉด

1 -> 4 -> 5 -> 6 -> 7 -> 9 -> 11 -> 12 -> 13 -> 14 -> 15 -> 18

์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•˜๋‹ค.
์ด์ง„๊ฒ€์ƒ‰๊ณผ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋…ธ๋“œ์˜ ์‚ฝ์ž…์ด ์‰ฝ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

1-1. ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์— ์˜ํ•ด

  • ์ตœ์†Ÿ๊ฐ’
    ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ ํ–ˆ์„ ๋•Œ ๋‚˜์˜ค๋Š” ํ‚ค ๊ฐ’์ด๋‹ค.

  • ์ตœ๋Œ“๊ฐ’
    ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ ํ–ˆ์„ ๋•Œ ๋‚˜์˜ค๋Š” ํ‚ค ๊ฐ’์ด๋‹ค.

1-2. Successor์™€ Predecessor

  • Successor
    ์ž„์˜์˜ ๋ฃจํŠธ๋…ธ๋“œ x๊ฐ€ ์กด์žฌํ•  ๋•Œ x๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ํ‚ค ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

  • Predecessor
    ์ž„์˜์˜ ๋ฃจํŠธ๋…ธ๋“œ x๊ฐ€ ์กด์žฌํ•  ๋•Œ x๋ณด๋‹ค ์ž‘์€ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ํฐ ํ‚ค ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

2. ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ

2-1. ๋…ธ๋“œ ํด๋ž˜์Šค Node<K,V>

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ๊ฐœ๋ณ„ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ, 4๊ฐœ์˜ ํ•„๋“œ๋กœ ๊ตฌ์„ฑ ๋œ๋‹ค.

  • key : ํ‚ค ๊ฐ’
  • data : ๋ฐ์ดํ„ฐ
  • left : ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ(์™ผ์ชฝ ํฌ์ธํ„ฐ)
  • right : ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ)

์˜ˆ์ œ ์ฝ”๋“œ

class Node<K,V>{
    K key;
    V data;
    Node<K, V> left;
    Node<K, V> right;

    // ์ƒ์„ฑ์ž
    Node(K key, V data, Node<K,V> left, Node<K,V> right){
        this.key = key;
        this.data = data;
        this.left = left;
        this.right = right;
    }

    // ํ‚ค ๊ฐ’์„ ๋ฐ˜ํ™˜
    K getKey(){
        return key;
    }
    
    // ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
    V getValue(){
        return data;
    }

    // ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ
    void print(){
        System.out.println(data);
    }
}

private Node<K,V> root;
private Comparator<? Super K> comparator = null;    // ๋น„๊ต์ž

2-2. ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ํด๋ž˜์Šค BinTree<K,V>

2๊ฐœ์˜ ํ•„๋“œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • root : ๋ฃจํŠธ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ณด์กด, ์œ ์ง€ํ•˜๋Š” ํ•„๋“œ
  • comparator : ํ‚ค ๊ฐ’์˜ ๋Œ€์†Œ ๊ด€๊ณ„๋ฅผ ๋น„๊ตํ•˜๋Š” ๋น„๊ต์ž

์˜ˆ์ œ ์ฝ”๋“œ

// ์ƒ์„ฑ์ž
public BinTree(){
    root = null;    // ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ
}

//์ƒ์„ฑ์ž
public BinTree(Comparator<? super K> c){
    this();
    comparator = c;
}

BinTree()์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑํ•œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์—์„œ๋Š” ๋…ธ๋“œ ํ‚ค ๊ฐ’์˜ ๋Œ€์†Œ๊ด€๊ณ„๋ฅผ ํŒ๋‹จํ•  ๋•Œ ์ž์—ฐ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ˆ˜ํ–‰๋œ๋‹ค.
๋”ฐ๋ผ์„œ ํ‚ค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” K์˜ ํ˜•์ด Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” Integerํด๋ž˜์Šค๋‚˜ Stringํด๋ž˜์Šค๋“ฑ์— ์•Œ๋งž๋‹ค.
๋‹ค๋ฅธ ์ƒ์„ฑ์ž BinTree(Comparator<? super K>c)์™€ ๋‹ฌ๋ฆฌ ๋น„๊ต์ž๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•„๋“œ comparator์˜ ๊ฐ’์€ ๋„์ด ๋œ๋‹ค.

BinTree(Comparator<? super K> c)์ƒ์„ฑ์ž๋Š” ์ธ์ˆ˜๋กœ ๋น„๊ต์ž๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ์ƒ์„ฑ์ž์ด๋‹ค.
์ด ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑํ•œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ์˜ ๋Œ€์†Œ ๊ด€๊ณ„๋ฅผ ํŒ๋‹จํ•  ๋•Œ ์ „๋‹ฌ๋ฐ›์€ ๋น„๊ต์ž์— ์˜ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค.

  • this()์— ์˜ํ•ด ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š๋Š” ์ƒ์„ฑ์ž BinTree()๋ฅผ ํ˜ธ์ถœ. root๊ฐ€ null์ธ ์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • ํ•„๋“œ comparator์— ์ „๋‹ฌ๋ฐ›์€ c๋ฅผ ์„ค์ •ํ•œ๋‹ค.

2-3. comp๋ฉ”์„œ๋“œ: ๋‘ ํ‚ค ๊ฐ’์„ ๋น„๊ต

2๊ฐœ์˜ ํ‚ค ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ๊ฒ€์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ์˜ ๊ฐ ๋ฉ”์„œ๋“œ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ์ด๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ

private int comp(K key1, K key2){
    return (comparator == null) ? ((Comparable<K>)key1).compareTo(key2) : comparator.compare(key1, key2);
}
  • key1 > key2๋ฉด ์–‘์ˆ˜
  • key1 < key2๋ฉด ์Œ์ˆ˜
  • key1 == key2๋ฉด 0

์ด์ง„ ๊ฒ€์ƒ‰ํŠธ๋ฆฌ์— ๋น„๊ต์ž comparator๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ 2๊ฐœ์˜ ํ‚ค๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค.

๋น„๊ต์ž comparator๊ฐ€ null์ธ ๊ฒฝ์šฐ

((Comparable<K>)key1).compareTo(key2)

key1์„ Comparable ์ธํ„ฐํŽ˜์ด์Šคํ˜•์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•˜๊ณ  compareTo๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ key2์™€ ๋น„๊ต

๋น„๊ต์ž comparator๊ฐ€ null์ด ์•„๋‹Œ ๊ฒฝ์šฐ

comparator.compare(key1, key2)

์„ค์ •๋œ ๋น„๊ต์ž comparator์˜ compare๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‘ ํ‚ค๊ฐ’ key1, key2๋ฅผ ๋น„๊ต

2-4. search ๋ฉ”์„œ๋“œ: ํ‚ค ๊ฐ’์œผ๋กœ ๊ฒ€์ƒ‰

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์—์„œ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด
๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ํ˜„์žฌ ์„ ํƒํ•œ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋ฉด์„œ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฒ€์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.

  1. ๋ฃจํŠธ๋ถ€ํ„ฐ ์„ ํƒํ•˜์—ฌ ๊ฒ€์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ ํƒํ•˜๋Š” ๋…ธ๋“œ๋ฅผ p๋ผ๊ณ  ํ•œ๋‹ค.
  2. p๊ฐ€ Null์ด๋ฉด ๊ฒ€์ƒ‰์— ์‹คํŒจํ•œ๋‹ค.
  3. ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฐ’ key์™€ ์„ ํƒํ•œ ๋…ธ๋“œ p์˜ ํ‚ค ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ
    • ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๊ฒ€์ƒ‰์— ์„ฑ๊ณต(๊ฒ€์ƒ‰ ์ข…๋ฅ˜)ํ•œ๋‹ค.
    • key๊ฐ€ ์ž‘์œผ๋ฉด ์„ ํƒํ•œ ๋…ธ๋“œ์— ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค(์™ผ์ชฝ์œผ๋กœ ๊ฒ€์ƒ‰ ์ง„ํ–‰).
    • key๊ฐ€ ํฌ๋ฉด ์„ ํƒํ•œ ๋…ธ๋“œ์— ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค(์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฒ€์ƒ‰ ์ง„ํ–‰).
  4. 2๋ฒˆ ๊ณผ์ •์œผ๋กœ ๋˜๋Œ์•„๊ฐ„๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ

public V search(K key){
    Node<K,V> p = root;

    while(true){
        if(p==null)
            return null;
        int cond = comp(key, p.getKey());
        if(cond==0)
            return p.getValue();    // ๊ฒ€์ƒ‰ ์„ฑ๊ณต
        else if(cond<0)
            p = p.left;
        else
            p = p.right;
    }
}

ํ‚ค ๊ฐ’์ด key์ธ ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ฒ€์ƒ‰์— ์„ฑ๊ณตํ•˜๋ฉด ๊ทธ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2-5. add ๋ฉ”์„œ๋“œ: ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ์กฐ๊ฑด์„ ์œ ์ง€ํ•˜๋„๋ก ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
์‚ฝ์ž…ํ•  ๋…ธ๋“œ์˜ ํ‚ค์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

  1. ๋ฃจํŠธ๋ฅผ ์„ ํƒํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ ํƒํ•˜๋Š” ๋…ธ๋“œ๋ฅผ node๋กœ ํ•œ๋‹ค.
  2. ์‚ฝ์ž…ํ•  ํ‚ค key์™€ ์„ ํƒ๋…ธ๋“œ node์˜ ํ‚ค ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค. ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ์‚ฝ์ž…์— ์‹คํŒจํ•œ๋‹ค(์ข…๋ฃŒ).
    • ๊ฐ’์ด ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ key๊ฐ’์ด ์‚ฝ์ž…ํ•  ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด,
      ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…(์ข…๋ฃŒ)
      ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์„ ํƒํ•œ ๋…ธ๋“œ๋ฅผ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธด๋‹ค.
    • key๊ฐ’์ด ์‚ฝ์ž…ํ•  ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด,
      ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…(์ข…๋ฃŒ)
      ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์„ ํƒํ•œ ๋…ธ๋“œ๋ฅผ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธด๋‹ค.
  3. 2๋กœ ๋˜๋Œ์•„ ๊ฐ„๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ

private void addNode(Node<K,V> node, K key, V data){
    int cond = comp(key, node.getKey());
    if(cond == 0)
        return;
    else if(cond<0){
        if(node.left == null)
            node.left = new Node<K,V>(key, data, null, null);
        else
            addNode(node.left, key, data);
    } else{
        if(node.right == null)
            node.right = new Node<K,V>(key, data, null, null);
        else
            addNode(node.right, key, data);
    }
}

public void add(K key, V data){
    if(root == null)
        root = new Node<K,V>(kdy, data, null, null);
    else
        addNode(root, key, data);
}

2-6. remove ๋ฉ”์„œ๋“œ: ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ

๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ๋Š” ์„ธ๊ฐ€์ง€ ์„œ๋กœ ๋‹ค๋ฅธ ์ƒํ™ฉ์— ์•Œ๋งž์€ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

1) ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ

  • ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹์ด๋ฉด ๋ถ€๋ชจ์˜ ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ null๋กœ ํ•œ๋‹ค.
  • ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด๋ฉด ๋ถ€๋ชจ์˜ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ฅผ null๋กœ ํ•œ๋‹ค.

2) ์ž์‹ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ

  • ์‚ญ์ œ ๋Œ€์ƒ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹์ด๋ฉด ๋ถ€๋ชจ์˜ ์™ผ์ชฝ ํฌ์ธํ„ฐ๊ฐ€ ์‚ญ์ œ ๋Œ€์ƒ ๋…ธ๋“œ์˜ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.
  • ์‚ญ์ œ ๋Œ€์ƒ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด๋ฉด ๋ถ€๋ชจ์˜ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๊ฐ€ ์‚ญ์ œ ๋Œ€์ƒ ๋…ธ๋“œ์˜ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.

3) ์ž์‹ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ์ธ ๊ฒฝ์šฐ

  1. ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์—์„œ ํ‚ค ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
    (Predecessor, ์ž์‹๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ด๊ฑฐ๋‚˜ ํ•˜๋‚˜๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.)

  2. ๊ฒ€์ƒ‰ํ•œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ ์œ„์น˜๋กœ ์˜ฎ๊ธด๋‹ค.

  3. ์˜ฎ๊ธด ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

    • ์˜ฎ๊ธด ๋…ธ๋“œ์— ์ž์‹์ด ์—†์œผ๋ฉด, ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ์˜ ์‚ญ์ œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    • ์˜ฎ๊ธด ๋…ธ๋“œ์— ์ž์‹์ด ์žˆ์œผ๋ฉด, ์ž์‹ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ ์žˆ๋Š” ๋…ธ๋“œ์˜ ์‚ญ์ œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ

์˜ˆ์ œ ์ฝ”๋“œ

public boolean remov(K key){
    Node<K,V> p = root;
    Node<K,V> parent = null;
    boolean isLeftChild = true;

    // ์‚ญ์ œํ•  ํ‚ค ๊ฒ€์ƒ‰
    while(true){
        if(p == null)
            return false;
        int cond = comp(key, p.getKey());   // key์™€ ๋…ธ๋“œp์˜ ํ‚ค ๊ฐ’์„ ๋น„๊ต
        if(cond == 0)   // ๊ฐ™์œผ๋ฉด ๊ฒ€์ƒ‰ ์„ฑ๊ณต
            break;
        else{
            parent = p;
            if(cond < 0){ // key์ชฝ์ด ์ž‘์œผ๋ฉด ์™ผ์ชฝ ์ž์‹์œผ๋กœ ๋‚ด๋ ค๊ฐ€๊ณ  ์™ผ์ชฝ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰
                ifLeftChild = true;
                p = p.left;
            }
            else{   // key์ชฝ์ด ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ ๋‚ด๋ ค๊ฐ€๊ณ  ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰
                isLeftChild = false;
                p = p.right;
            }
        }
    }

    /* 
    ์ž์‹๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์ž์‹๋…ธ๋“œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ์˜ ๊ณผ์ • ์ˆ˜ํ–‰
    ์‚ญ์ œ ๋…ธ๋“œ์— ์™ผ์ชฝ ์ž์‹์ด ์—†์œผ๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ๊ฐ€ null,
    ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์—†์œผ๋ฉด ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๊ฐ€ null์ด ๋˜๋Š” ๋ฐฉ๋ฒ• ์ด์šฉ
    */
    if(p.left == null){ // p์— ์™ผ์ชฝ ์ž์‹์ด ์—†์Œ
        if(p == root)
            root = p.right;
        else if(isLeftChild)
            parent.left = p.right;
        else
            parent.right = p.right;
    }
    else if(p.right == null){   // p์— ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์—†์Œ
        if(p == root)
            root = p.left;
        else if(isLeftChild)
            parent.left = p.left;
        else
            parent.right = p.left;
    }

    // ์ž์‹ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ์ธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ–‰ 
    else{
        parent = p;
        Node<K,V> left = p.left;    // ์„œ๋ธŒ ํŠธ๋ฆฌ ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ
        isLeftChild = true;
        while(left.right != null){  // ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ left๋ฅผ ๊ฒ€์ƒ‰
            parent = left;
            left = left.right;
            isLeftChild = false;
        }
        p.key = left.key;   // left์˜ ํ‚ค ๊ฐ’์„ p๋กœ ์˜ฎ๊น€
        p.data = left.data; // left์˜ ๋ฐ์ดํ„ฐ๋ฅผ p๋กœ ์˜ฎ๊น€
        if(isLeftChild)
            parent.left = left.left;    // left๋ฅผ ์‚ญ์ œ
        else
            parent.right = left.left;   // left๋ฅผ ์‚ญ์ œ
    }
    return true;
}