์ด์ง„ ํŠธ๋ฆฌ ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•

์„œ๊ณก

์ด ๋ฌธ์„œ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ตœ๊ทผ์— ๊ด€ํ•œ ๊ธฐ์‚ฌ๋ฅผ ์ผ์Šต๋‹ˆ๋‹ค. ํ—ˆํ”„๋งŒ ๋ฐฉ์‹์„ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ์••์ถ• ๊ฑฐ๊ธฐ์„œ๋Š” ๊ฒ€์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ๋ฐฉ๋ฒ•์ด ๊ด€๋ จ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ง„ ํŠธ๋ฆฌ์— ๋ณ„๋กœ ๊ด€์‹ฌ์„ ๋‘์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‚˜๋Š” ๋‚˜๋ฌด์— ๊ด€ํ•œ ๊ธฐ์‚ฌ๋ฅผ ์“ฐ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜์ž.

ํŠธ๋ฆฌ๋Š” ๋ชจ์„œ๋ฆฌ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๋Š” ๊ทธ๋ž˜ํ”„์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์˜ˆ์ œ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด๊ฒƒ์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค! ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋ฆฝ๋‹ˆ๋‹ค!

์ „๋ฌธ ์šฉ์–ด

๋ฃจํŠธ

๋‚˜๋ฌด๋ฟŒ๋ฆฌ - ์ด๊ฒƒ์€ ์ตœ์ƒ์œ„ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋…ธ๋“œ A์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์—์„œ๋Š” ๋ฃจํŠธ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค! ์‹ค์ œ๋กœ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์ด ๋…ธ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ํ•˜์œ„ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ชจ/์ž์†

๋ฃจํŠธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ์—๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด์–ด์ง€๋Š” ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๊ฐ„์„ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋…ธ๋“œ ์œ„์— ์œ„์น˜ํ•œ ๋…ธ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ์˜ ์ด ๋…ธ๋“œ. ํ˜„์žฌ ๋…ธ๋“œ ์•„๋ž˜์— ์œ„์น˜ํ•˜๊ณ  ์ด์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ž์† ์ด ๋…ธ๋“œ. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ B๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ทธ ๋ถ€๋ชจ๋Š” ๋…ธ๋“œ A๊ฐ€ ๋˜๊ณ  ์ž์‹์€ ๋…ธ๋“œ D, E, F๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์‹œํŠธ

์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ๋ฅผ ํŠธ๋ฆฌ์˜ ๋ฆฌํ”„(leaf)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ ๋ฆฌํ”„๋Š” ๋…ธ๋“œ D, E, F, G, I, J, K๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ธฐ๋ณธ ์šฉ์–ด์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋Š” ๋” ์ž์„ธํžˆ ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ XNUMX๊ฐœ ์ดํ•˜์˜ ์ž์‹์„ ๊ฐ–๋Š” ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ง์ž‘ํ•œ ๋Œ€๋กœ, ๋…ธ๋“œ B์™€ H์—๋Š” ์„ธ ๊ฐœ ์ด์ƒ์˜ ์ž์‹์ด ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ์ œ์˜ ํŠธ๋ฆฌ๋Š” ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํŠธ๋ฆฌ ๋…ธ๋“œ์—๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์„ ๊ฐ–๋Š” ์ด์ง„ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  1. ์™ผ์ชฝ ๋ฐ ์˜ค๋ฅธ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ๋Š” ๋ชจ๋‘ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  2. ์ž„์˜์˜ ๋…ธ๋“œ X์˜ ์™ผ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋…ธ๋“œ X ์ž์ฒด์˜ ๋ฐ์ดํ„ฐ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ ํ‚ค ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  3. ์ž„์˜์˜ ๋…ธ๋“œ X์˜ ์˜ค๋ฅธ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋…ธ๋“œ X ์ž์ฒด์˜ ๋ฐ์ดํ„ฐ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํ‚ค ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์—ด์‡  โ€” ๋…ธ๋“œ์˜ ๋ชจ๋“  ํŠน์„ฑ(์˜ˆ: ์ˆซ์ž) ์ด ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ํŠธ๋ฆฌ ์š”์†Œ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ์˜ˆ:

์ด์ง„ ํŠธ๋ฆฌ ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํŠธ๋ฆฌ ๋ณด๊ธฐ

์ง„ํ–‰ํ•˜๋ฉด์„œ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์ผ๋ถ€(์•„๋งˆ๋„ ๋ถˆ์™„์ „ํ•œ) ์ฝ”๋“œ ์กฐ๊ฐ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋Š” ๊ธฐ์‚ฌ ๋ ๋ถ€๋ถ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ตฌ์กฐ:

public class Node<T> {
    private T data;
    private int key;
    private Node<T> leftChild;
    private Node<T> rightChild;

    public Node(T data, int key) {
        this.data = data;
        this.key = key;
    }
    public Node<T> getLeftChild() {
        return leftChild;
    }

    public Node<T> getRightChild() {
        return rightChild;
    }
//...ะพัั‚ะฐะปัŒะฝั‹ะต ะผะตั‚ะพะดั‹ ัƒะทะปะฐ
}

๊ฐ ๋…ธ๋“œ์—๋Š” ๋‘ ๊ฐœ์˜ ํ•˜์œ„ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. leftChild ๋ฐ/๋˜๋Š” rightChild ํ•˜์œ„ ํ•ญ๋ชฉ์— null ๊ฐ’์ด ํฌํ•จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ˆซ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‚ค - ๋…ธ๋“œ ํ‚ค.

์šฐ๋ฆฌ๋Š” ๋งค๋“ญ์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‚˜๋ฌด์— ๋Œ€ํ•œ ์‹œ๊ธ‰ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ์‹œ๋‹ค. ์ดํ•˜์—์„œ "ํŠธ๋ฆฌ"๋ผ๋Š” ๋‹จ์–ด๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ฐœ๋…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ:

public class BinaryTree<T> {
     private Node<T> root;

    //ะผะตั‚ะพะดั‹ ะดะตั€ะตะฒะฐ
}

ํด๋ž˜์Šค ํ•„๋“œ๋กœ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ์—์„œ getLeftChild() ๋ฐ getRightChild() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ˆ˜์ƒ‰

๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ‚ค ํ‚ค๊ฐ€ ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฃจํŠธ๋ถ€ํ„ฐ ํŠธ๋ฆฌ ์•„๋ž˜๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋™ํ•˜๊ณ  ํ‚ค ๊ฐ’์„ ๋‹ค์Œ ๋…ธ๋“œ์˜ ํ‚ค์™€ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์†์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋” ํฌ๊ณ  ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ‚ค๊ฐ€ ๋™์ผํ•˜๋ฉด ์›ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋ฉ๋‹ˆ๋‹ค! ๊ด€๋ จ ์ฝ”๋“œ:

public Node<T> find(int key) {
    Node<T> current = root;
    while (current.getKey() != key) {
        if (key < current.getKey())
            current = current.getLeftChild();
        else
            current = current.getRightChild();
        if (current == null)
            return null;
    }
    return current;
}

current๊ฐ€ null์ด ๋˜๋ฉด ๊ฒ€์ƒ‰์ด ํŠธ๋ฆฌ์˜ ๋์— ๋„๋‹ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐœ๋…์  ์ˆ˜์ค€์—์„œ ์‚ฌ์šฉ์ž๋Š” ํŠธ๋ฆฌ์˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์œ„์น˜(๋ฆฌํ”„์˜ ์ž์†)์— ์žˆ์Šต๋‹ˆ๋‹ค).

๊ท ํ˜• ํŠธ๋ฆฌ(๋…ธ๋“œ๊ฐ€ ์–ด๋Š ์ •๋„ ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋˜์–ด ์žˆ๋Š” ํŠธ๋ฆฌ)์—์„œ ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ฑ์„ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฒ€์ƒ‰ ํšจ์œจ์„ฑ์€ O(log(n))์ด ๋˜๊ณ  ๋กœ๊ทธ๋Š” ๋ฐ‘์ด 2์ž…๋‹ˆ๋‹ค. ๋ณด์„ธ์š”: ๊ท ํ˜• ํŠธ๋ฆฌ์— n๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ์ด๋Š” ๋ฐ‘์ด 2์ธ ์ˆ˜์ค€์˜ log(n)๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋ฌด. ๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ƒ‰์—์„œ๋Š” ์ฃผ๊ธฐ์˜ ํ•œ ๋‹จ๊ณ„์—์„œ ํ•œ ๋‹จ๊ณ„ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค.

์‚ฝ์ž…

๊ฒ€์ƒ‰์˜ ๋ณธ์งˆ์„ ํŒŒ์•…ํ•˜๋ฉด ์‚ฝ์ž…์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์— ์„ค๋ช…๋œ ํ•˜๊ฐ• ๊ทœ์น™์— ๋”ฐ๋ผ ๋‚˜๋ฌด ์žŽ์œผ๋กœ ๋‚ด๋ ค๊ฐ€ ํ‚ค์— ๋”ฐ๋ผ ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์˜ ํ•˜์œ„ ํ•ญ๋ชฉ์ด ๋˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„:

   public void insert(T insertData, int key) {
        Node<T> current = root;
        Node<T> parent;
        Node<T> newNode = new Node<>(insertData, key);
        if (root == null)
            root = newNode;
        else {
            while (true) {
                parent = current;
                if (key < current.getKey()) {
                    current = current.getLeftChild();
                    if (current == null) {
                         parent.setLeftChild(newNode);
                         return;
                    }
                }
                else {
                    current = current.getRightChild();
                    if (current == null) {
                        parent.setRightChild(newNode);
                        return;
                    }
                }
            }
        }
    }

์ด ๊ฒฝ์šฐ ํ˜„์žฌ ๋…ธ๋“œ ์™ธ์— ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. current๊ฐ€ null์ด ๋˜๋ฉด ์ƒ์œ„ ๋ณ€์ˆ˜์— ํ•„์š”ํ•œ ์‹œํŠธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์‚ฝ์ž…์˜ ํšจ์œจ์„ฑ์€ ๋ถ„๋ช…ํžˆ ๊ฒ€์ƒ‰์˜ ํšจ์œจ์„ฑ(O(log(n)))๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฑฐ

์ œ๊ฑฐ๋Š” ๋‚˜๋ฌด์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฐ€์žฅ ์–ด๋ ค์šด ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์‚ญ์ œํ•  ์š”์†Œ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌ๋ฉด ์–ด์ฉŒ์ฃ ? ๋‹จ์ˆœํžˆ ์ฐธ์กฐ๋ฅผ null๋กœ ์„ค์ •ํ•˜๋ฉด ์ด ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ์ธ ํ•˜์œ„ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋ฌด ์ œ๊ฑฐ ๋ฐฉ๋ฒ•์€ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

์ฒซ ๋ฒˆ์งธ ์‚ฌ๋ก€. ์‚ญ์ œ ์ค‘์ธ ๋…ธ๋“œ์— ํ•˜์œ„ ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ์— ์ž์‹์ด ์—†์œผ๋ฉด ์ด๋Š” ๋ฆฌํ”„๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์ƒ์œ„ ํ•ญ๋ชฉ์˜ leftChild ๋˜๋Š” rightChild ํ•„๋“œ๋ฅผ null๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์‚ฌ๋ก€. ์‚ญ์ œํ•  ๋…ธ๋“œ์— ์ž์‹์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ๋„ ๊ทธ๋ฆฌ ๋ณต์žกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์˜ˆ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ 14์ธ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์š”์†Œ๋Š” ํ‚ค๊ฐ€ 10์ธ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์†์ด๋ฏ€๋กœ ํ•ด๋‹น ํ•˜์œ„ ํ•ญ๋ชฉ(์ด ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ ์š”์†Œ) ์ค‘ ํ•˜๋‚˜๋Š” 10๋ณด๋‹ค ํฐ ํ‚ค๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์—์„œ ์‰ฝ๊ฒŒ "์ž˜๋ผ๋‚ผ" ์ˆ˜ ์žˆ๊ณ , ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ ์ค‘์ธ ๋…ธ๋“œ์˜ ํ•˜์œ„ ๋…ธ๋“œ์— ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ‚ค 10์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ๋…ธ๋“œ 13์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ์˜ ์™ผ์ชฝ ์ž์‹์ธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ƒํ™ฉ์€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์Šค์Šค๋กœ ์ƒ๊ฐํ•ด๋ณด์‹ญ์‹œ์˜ค - ์ •ํ™•ํ•œ ๋น„์œ ์ž…๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ์‚ฌ๋ก€. ๋…ธ๋“œ์—๋Š” ๋‘ ๊ฐœ์˜ ์ž์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์–ด๋ ค์šด ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ›„๊ณ„์ž ์ฐพ๊ธฐ

ํ‚ค๊ฐ€ 25์ธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ž๋ฆฌ์— ๋ˆ„๊ตฌ๋ฅผ ๋„ฃ์–ด์•ผ ํ• ๊นŒ์š”? ๊ทธ์˜ ์ถ”์ข…์ž(ํ›„์† ๋˜๋Š” ํ›„์†) ์ค‘ ํ•œ ์‚ฌ๋žŒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž„(์ œ๊ฑฐ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ๋Œ€์‹ ํ•  ์‚ฌ๋žŒ)

๋ˆ„๊ฐ€ ํ›„๊ณ„์ž๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•˜๋‚˜์š”? ์ง๊ด€์ ์œผ๋กœ ์ด๊ฒƒ์€ ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ์—์„œ ๋‹ค์Œ์œผ๋กœ ํฐ ํ‚ค๋ฅผ ๊ฐ–๋Š” ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์ž์†์œผ๋กœ ์ด๋™ํ•œ ๋‹ค์Œ(์ด๋ฏธ ํ›„์† ํ‚ค๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ํฌ๋‹ค๊ณ  ๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์˜ค๋ฅธ์ชฝ ์ž์†์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•จ) ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ์˜ค๋ฅธ์ชฝ ์ž์†์˜ ์™ผ์ชฝ ์ž์† ์ฒด์ธ์„ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. . ์˜ˆ์ œ์—์„œ๋Š” ํ‚ค๊ฐ€ 35์ธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ ๋‹ค์Œ ์™ผ์ชฝ ์ž์‹ ์ฒด์ธ์„ ํ†ตํ•ด ๋ฆฌํ”„๋กœ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด ์ฒด์ธ์€ ํ‚ค๊ฐ€ 30์ธ ๋…ธ๋“œ๋กœ๋งŒ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ณด๋‹ค ํฐ ๋…ธ๋“œ ์ง‘ํ•ฉ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์— ๋Œ€ํ•ด.

์ด์ง„ ํŠธ๋ฆฌ ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ›„์† ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ• ์ฝ”๋“œ:

    public Node<T> getSuccessor(Node<T> deleteNode) {
        Node<T> parentSuccessor = deleteNode;//ั€ะพะดะธั‚ะตะปัŒ ะฟั€ะตะตะผะฝะธะบะฐ
        Node<T> successor = deleteNode;//ะฟั€ะตะตะผะฝะธะบ
        Node<T> current = successor.getRightChild();//ะฟั€ะพัั‚ะพ "ะฟั€ะพะฑะตะณะฐัŽั‰ะธะน" ัƒะทะตะป
        while (current != null) {
            parentSuccessor = successor;
            successor = current;
            current = current.getLeftChild();
        }
        //ะฝะฐ ะฒั‹ั…ะพะดะต ะธะท ั†ะธะบะปะฐ ะธะผะตะตะผ ะฟั€ะตะตะผะฝะธะบะฐ ะธ ั€ะพะดะธั‚ะตะปั ะฟั€ะตะตะผะฝะธะบะฐ
        if (successor != deleteNode.getRightChild()) {//ะตัะปะธ ะฟั€ะตะตะผะฝะธะบ ะฝะต ัะพะฒะฟะฐะดะฐะตั‚ ั ะฟั€ะฐะฒั‹ะผ ะฟะพั‚ะพะผะบะพะผ ัƒะดะฐะปัะตะผะพะณะพ ัƒะทะปะฐ
            parentSuccessor.setLeftChild(successor.getRightChild());//ั‚ะพ ะตะณะพ ั€ะพะดะธั‚ะตะปัŒ ะทะฐะฑะธั€ะฐะตั‚ ัะตะฑะต ะฟะพั‚ะพะผะบะฐ ะฟั€ะตะตะผะฝะธะบะฐ, ั‡ั‚ะพะฑั‹ ะฝะต ะฟะพั‚ะตั€ัั‚ัŒ ะตะณะพ
            successor.setRightChild(deleteNode.getRightChild());//ัะฒัะทั‹ะฒะฐะตะผ ะฟั€ะตะตะผะฝะธะบะฐ ั ะฟั€ะฐะฒั‹ะผ ะฟะพั‚ะพะผะบะพะผ ัƒะดะฐะปัะตะผะพะณะพ ัƒะทะปะฐ
        }
        return successor;
    }

์‚ญ์ œ ๋ฉ”์†Œ๋“œ์˜ ์ „์ฒด ์ฝ”๋“œ:

public boolean delete(int deleteKey) {
        Node<T> current = root;
        Node<T> parent = current;
        boolean isLeftChild = false;//ะ’ ะทะฐะฒะธัะธะผะพัั‚ะธ ะพั‚ ั‚ะพะณะพ, ัะฒะปัะตั‚ัั ะปะธ  ัƒะดะฐะปัะตะผั‹ะน ัƒะทะตะป ะปะตะฒั‹ะผ ะธะปะธ ะฟั€ะฐะฒั‹ะผ ะฟะพั‚ะพะผะบะพะผ ัะฒะพะตะณะพ ั€ะพะดะธั‚ะตะปั, ะฑัƒะปะตะฒัะบะฐั ะฟะตั€ะตะผะตะฝะฝะฐั isLeftChild ะฑัƒะดะตั‚ ะฟั€ะธะฝะธะผะฐั‚ัŒ ะทะฝะฐั‡ะตะฝะธะต true ะธะปะธ false ัะพะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพ.
        while (current.getKey() != deleteKey) {
            parent = current;
            if (deleteKey < current.getKey()) {
                current = current.getLeftChild();
                isLeftChild = true;
            } else {
                isLeftChild = false;
                current = current.getRightChild();
            }
            if (current == null)
                return false;
        }

        if (current.getLeftChild() == null && current.getRightChild() == null) {//ะฟะตั€ะฒั‹ะน ัะปัƒั‡ะฐะน
            if (current == root)
                current = null;
            else if (isLeftChild)
                parent.setLeftChild(null);
            else
                parent.setRightChild(null);
        }
        else if (current.getRightChild() == null) {//ะฒั‚ะพั€ะพะน ัะปัƒั‡ะฐะน
            if (current == root)
                root = current.getLeftChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getLeftChild());
            else
                current.setRightChild(current.getLeftChild());
        } else if (current.getLeftChild() == null) {
            if (current == root)
                root = current.getRightChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getRightChild());
            else
                parent.setRightChild(current.getRightChild());
        } 
        else {//ั‚ั€ะตั‚ะธะน ัะปัƒั‡ะฐะน
            Node<T> successor = getSuccessor(current);
            if (current == root)
                root = successor;
            else if (isLeftChild)
                parent.setLeftChild(successor);
            else
                parent.setRightChild(successor);
        }
        return true;
    }

๋ณต์žก์„ฑ์€ O(log(n))๋กœ ๊ทผ์‚ฌํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ์—์„œ ์ตœ๋Œ€๊ฐ’/์ตœ์†Œ๊ฐ’ ์ฐพ๊ธฐ

ํŠธ๋ฆฌ์—์„œ ์ตœ์†Œ/์ตœ๋Œ€ ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ ํŠธ๋ฆฌ์˜ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ์š”์†Œ ์ฒด์ธ์„ ๋”ฐ๋ผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œํŠธ์— ๋„๋‹ฌํ•˜๋ฉด ์ตœ์†Œ/์ตœ๋Œ€ ์š”์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

    public Node<T> getMinimum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getLeftChild();
        }
        return parent;
    }

    public Node<T> getMaximum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getRightChild();
        }
        return parent;
    }

๋ณต์žก๋„ - O(log(n))

๋Œ€์นญ ๋ฐ”์ดํŒจ์Šค

์ˆœํšŒ๋Š” ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฌ๊ท€ ๋Œ€์นญ ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. ์™ผ์ชฝ ์ž์‹์— ๋Œ€ํ•ด ์ž‘์—… ์ˆ˜ํ–‰
  2. ์Šค์Šค๋กœ ํ–‰๋™์„ ํ•ด๋ณด์„ธ์š”
  3. ์˜ฌ๋ฐ”๋ฅธ ํ•˜์œ„ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ž‘์—… ์ˆ˜ํ–‰

์ฝ”๋“œ :

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");//ะ—ะดะตััŒ ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฒัะต, ั‡ั‚ะพ ัƒะณะพะดะฝะพ
            inOrder(current.getRightChild());
        }
    }

๊ฒฐ๋ก 

๋งˆ์ง€๋ง‰์œผ๋กœ! ์ œ๊ฐ€ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด๋‚˜ ์˜๊ฒฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ์•ฝ์†๋Œ€๋กœ ์™„์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Node.java:

public class Node<T> {
    private T data;
    private int key;
    private Node<T> leftChild;
    private Node<T> rightChild;

    public Node(T data, int key) {
        this.data = data;
        this.key = key;
    }

    public void setLeftChild(Node<T> newNode) {
        leftChild = newNode;
    }

    public void setRightChild(Node<T> newNode) {
        rightChild = newNode;
    }

    public Node<T> getLeftChild() {
        return leftChild;
    }

    public Node<T> getRightChild() {
        return rightChild;
    }

    public T getData() {
        return data;
    }

    public int getKey() {
        return key;
    }
}

BinaryTree.java:

public class BinaryTree<T> {
    private Node<T> root;

    public Node<T> find(int key) {
        Node<T> current = root;
        while (current.getKey() != key) {
            if (key < current.getKey())
                current = current.getLeftChild();
            else
                current = current.getRightChild();
            if (current == null)
                return null;
        }
        return current;
    }

    public void insert(T insertData, int key) {
        Node<T> current = root;
        Node<T> parent;
        Node<T> newNode = new Node<>(insertData, key);
        if (root == null)
            root = newNode;
        else {
            while (true) {
                parent = current;
                if (key < current.getKey()) {
                    current = current.getLeftChild();
                    if (current == null) {
                         parent.setLeftChild(newNode);
                         return;
                    }
                }
                else {
                    current = current.getRightChild();
                    if (current == null) {
                        parent.setRightChild(newNode);
                        return;
                    }
                }
            }
        }
    }

    public Node<T> getMinimum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getLeftChild();
        }
        return parent;
    }

    public Node<T> getMaximum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getRightChild();
        }
        return parent;
    }

    public Node<T> getSuccessor(Node<T> deleteNode) {
        Node<T> parentSuccessor = deleteNode;
        Node<T> successor = deleteNode;
        Node<T> current = successor.getRightChild();
        while (current != null) {
            parentSuccessor = successor;
            successor = current;
            current = current.getLeftChild();
        }

        if (successor != deleteNode.getRightChild()) {
            parentSuccessor.setLeftChild(successor.getRightChild());
            successor.setRightChild(deleteNode.getRightChild());
        }
        return successor;
    }

    public boolean delete(int deleteKey) {
        Node<T> current = root;
        Node<T> parent = current;
        boolean isLeftChild = false;
        while (current.getKey() != deleteKey) {
            parent = current;
            if (deleteKey < current.getKey()) {
                current = current.getLeftChild();
                isLeftChild = true;
            } else {
                isLeftChild = false;
                current = current.getRightChild();
            }
            if (current == null)
                return false;
        }

        if (current.getLeftChild() == null && current.getRightChild() == null) {
            if (current == root)
                current = null;
            else if (isLeftChild)
                parent.setLeftChild(null);
            else
                parent.setRightChild(null);
        }
        else if (current.getRightChild() == null) {
            if (current == root)
                root = current.getLeftChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getLeftChild());
            else
                current.setRightChild(current.getLeftChild());
        } else if (current.getLeftChild() == null) {
            if (current == root)
                root = current.getRightChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getRightChild());
            else
                parent.setRightChild(current.getRightChild());
        } 
        else {
            Node<T> successor = getSuccessor(current);
            if (current == root)
                root = successor;
            else if (isLeftChild)
                parent.setLeftChild(successor);
            else
                parent.setRightChild(successor);
        }
        return true;
    }

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");
            inOrder(current.getRightChild());
        }
    }
}

PS

O(n)์œผ๋กœ์˜ ๋ณ€์„ฑ

๋งŽ์€ ๋ถ„๋“ค์ด ๋ˆˆ์น˜์ฑ„์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋ฌด๋ฅผ ๋ถˆ๊ท ํ˜•ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด, ํ‚ค๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ํŠธ๋ฆฌ์— 1,2,3,4,5,6... ๋†“์œผ๋ฉด ํŠธ๋ฆฌ๋Š” ์—ฐ๊ฒฐ๋œ ๋ชฉ๋ก๊ณผ ์–ด๋Š ์ •๋„ ๋น„์Šทํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์žƒ์–ด ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค์˜ ํšจ์œจ์„ฑ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ์ž‘์—…์˜ ๋ณต์žก๋„๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋ณต์žก๋„(O(n))์™€ ๋™์ผํ•ด์ง‘๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด ์ด์ง„ ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‹จ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž๋งŒ ์„ค๋ฌธ ์กฐ์‚ฌ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์ œ๋ฐœ

์ €๋Š” ํ—ˆ๋ธŒ์— ์˜ค๋ž˜ ๋จธ๋ฌผ์ง€ ์•Š์•˜๋Š”๋ฐ, ์–ด๋–ค ์ฃผ์ œ์— ๊ด€ํ•œ ์–ด๋–ค ๊ธฐ์‚ฌ๋ฅผ ๋” ๋ณด๊ณ  ์‹ถ์€์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜(DP, ์žฌ๊ท€, ๋ฐ์ดํ„ฐ ์••์ถ• ๋“ฑ)

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹ค์ƒํ™œ์— ์ ์šฉ

  • Java๋กœ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • Java๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

2๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 1๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜: www.habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€