Binary Search Tree

Node

public class Node{
    private int key;
    private Object value;

    private Node left;
    private Node right;

    public Node(int key, Object value){
        this.key = key;
        this.value = value;
    }

    // Getter, Setter 생략
}

Binary Search Tree


public class BinarySearchTree {
    private Node root;

    public Object get(int key){
        Node current = root;

        while(current != null){
            if(current.getKey() == key){
                return current.getValue();
            }

            if(current.getKey() > key) {
                current = current.getLeft();
            }else{
                current = current.getRight();
            }
        }
        return null;
    }

    public void put(int key, Object value){
        root = putItem(root, key, value);
    }

    public Node putItem(Node node, int key, Object value){
        if(node == null){
            return new Node(key, value);
        }
        if(key < node.getKey()){
            node.setLeft(putItem(node.getLeft(), key, value));
        }else if(key > node.getKey()){
            node.setRight(putItem(node.getRight(), key, value));
        }else{
            node.setValue(value);
        }
        return node;
    }

    public void delete(int key){
        root = deleteItem(root, key);
    }

    public Node deleteItem(Node node, int key){
        // 삭제하고자 하는 키의 노드가 없음
        if(node == null){
            return null;
        }

        if(key < node.getKey()){
            node.setLeft(deleteItem(node.getLeft(), key));
        }else if(key > node.getKey()){
            node.setRight(deleteItem(node.getRight(), key));
        }else{
            if(node.getRight() == null){
                return node.getLeft();
            }

            if(node.getLeft() == null) {
                return node.getRight();
            }

            Node target = node;

            node = getMin(target.getRight());
            node.setRight(delMinimum(target.getRight()));
            node.setLeft(target.getLeft());
        }
        return node;
    }
    public Node getMin(Node node){
        if(node.getLeft() == null){
            return node;
        }
        return getMin(node.getLeft());
    }

    public Node delMinimum(Node node){
        if(node.getLeft() == null){
            return node.getRight();
        }
        node.setLeft(delMinimum(node.getLeft()));
        return node;
    }

    public void traverse(Node node){
        if(node == null){
            return;
        }
        traverse(node.getLeft());
        System.out.printf("%d ",node.getKey());
        traverse(node.getRight());
    }

    public Node getRoot() {
        return root;
    }

    public void setRoot(Node root) {
        this.root = root;
    }
}