Live Today

[์ž๋ฃŒ๊ตฌ์กฐ] Binary Search Tree(์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ) ๋ณธ๋ฌธ

Computer Science/์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] 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)๋Š” ์ด์ง„ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ํƒ์ƒ‰์„ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
  • ์ด์ง„ํƒ์ƒ‰์˜ ํšจ์œจ์ ์ธ ํƒ์ƒ‰ ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๋ฉฐ, ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.

https://blog.kakaocdn.net/dn/b50CLv/btrfWceBceL/lLCTey5Fyvc5X92i5MaLk1/img.png

  • ์œ„์˜ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์—์„œ, 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๊ฐ€์ง€ ์กฐ๊ฑด

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

  • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์œ ์ผํ•œ ํ‚ค๋ฅผ ๊ฐ–๋Š”๋‹ค. (์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋œ๋‹ค.)
    • ์ค‘๋ณต์ด ์—†์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š”?
    • ๊ฒ€์ƒ‰ ๋ชฉ์  ์ž๋ฃŒ๊ตฌ์กฐ์ธ๋ฐ, ๊ตณ์ด ์ค‘๋ณต์ด ๋งŽ์€ ๊ฒฝ์šฐ์— ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋Š๋ฆฌ๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ. (ํŠธ๋ฆฌ์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, ๋…ธ๋“œ์— count ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ํšจ์œจ์ )
  • ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ฐ’์€ ๊ทธ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๊ฐ’๋ณด๋‹ค ๋ฐ˜๋“œ์‹œ ์ž‘๋‹ค.
  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ฐ’์€ ๊ทธ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๊ฐ’๋ณด๋‹ค ๋ฐ˜๋“œ์‹œ ํฌ๋‹ค.
  • ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋„ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์ด๋‹ค.

 

3๏ธโƒฃ Binary Search Tree(์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ)์˜ ์—ฐ์‚ฐ

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

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;
    }

 

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 ๊ตฌํ˜„

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

[์ž๋ฃŒ๊ตฌ์กฐ] ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)์˜ ์ •์˜, ๋…ธ๋“œ ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ

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

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ (Binary Search Tree) | ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป Tech Interview

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