๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์ž๋ฃŒ ๊ตฌ์กฐ] - ํŠธ๋ฆฌ ์ž๋ฃŒ ๊ตฌ์กฐ (4)-์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์ž๋ฐ”๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ :: Binary Search Tree implementation by java

by Wonit 2020. 6. 18.

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

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ Binary Search Tree

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ Binary Search Tree๋ผ๊ณ  ํ•œ๋‹ค.

๊ธฐ๋ณธ ์ „์ œ : ํŠธ๋ฆฌ์˜ ํ‚ค์—๋Š” ๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•˜๋ฉฐ ๊ฐ’๋“ค์€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์ง‘๋‹จ์ด ์กด์žฌํ•˜๋Š” ์ „์ˆœ์„œ ์—ฌ์•ผ ํ•œ๋‹ค.

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

์กฐ๊ฑด์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด ํ•œ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ํ•ด๋‹น ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ, ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐฐ์น˜๊ฐ€ ๋œ ๊ฒƒ๋“ค์ด ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(BST)๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด์ œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์™œ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž๋ฉด

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

 

์ด ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„ ์—ฐ์‚ฐ์œผ๋กœ ํ•˜๋ฉด ํ‚ค ๊ฐ’์˜ ์˜ค๋ฆ„ ์ฐจ์ˆœ์œผ๋กœ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋กœ ๋…ธ๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ด ๊ฒƒ์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ฉฐ ์ดํ•ดํ•ด๋ณด์ž.

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

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ€์„œ ๊ฐ€๋ณ๊ฒŒ ์ฝ๊ณ  ์˜ค๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

๋…ธ๋“œ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

BST์˜ ๊ฐœ๋ณ„ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Nodeํด๋ž˜์Šค ์ด๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3๊ฐœ์˜ ํ•„๋“œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • data : ๋…ธ๋“œ๊ฐ€ ๊ฐ–๋Š” ์‹ค์งˆ์  ๋ฐ์ดํ„ฐ
  • left : ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹
  • right : ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹

Node<K, V>

์ด์ œ ๋…ธ๋“œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฏ€๋กœ ๋…ธ๋“œ์˜ ์ƒ์„ฑ์ž์™€ 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๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

  1. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
  2. ํ•˜๋‚˜์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ
  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;
    }

์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ

package theory.tree;

import java.util.Scanner;

public class BinarySearchTree {
    public class Node {
        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 Node root;
    BinarySearchTree(){
        root = null;
    }

    /*ํƒ์ƒ‰ ์—ฐ์‚ฐ*/
    public boolean find(int key){
        Node currentNode = root;
        while(currentNode != null){
            // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์ฐพ๋Š” ๊ฐ’์ด ๊ฐ™์œผ๋ฉด
            if(currentNode.getData() == key){
                return true;
            }else if(currentNode.getData() > key){ // ์ฐพ๋Š” ๊ฐ’์ด ํ˜„์žฌ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์œผ๋ฉด
                currentNode = currentNode.getLeft();
            }else {// ์ฐพ๋Š” ๊ฐ’์ด ํ˜„์žฌ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๋ฉด
                currentNode = currentNode.getRight();
            }
        }
        return false;
    }

    /*์‚ฝ์ž… ์—ฐ์‚ฐ*/
    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 ;
                }
            }
        }

    }

    /*์‚ญ์ œ ์—ฐ์‚ฐ*/
    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;
    }
}

๋Œ“๊ธ€