เชฌเชพเชˆเชจเชฐเซ€ เชŸเซเชฐเซ€ เช…เชฅเชตเชพ เชฌเชพเชˆเชจเชฐเซ€ เชธเชฐเซเชš เชŸเซเชฐเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเซ€

เชซเซ‹เชฐเชชเซเชฒเซ‡

เช† เชฒเซ‡เช– เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชถเซ‹เชง เชตเซƒเช•เซเชทเซ‹ เชตเชฟเชถเซ‡ เช›เซ‡. เชฎเซ‡เช‚ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชตเชฟเชถเซ‡ เชเช• เชฒเซ‡เช– เชฒเช–เซเชฏเซ‹ เชนเชคเซ‹ เชนเชซเชฎเซ‡เชจ เชชเชฆเซเชงเชคเชฟ เชฆเซเชตเชพเชฐเชพ เชกเซ‡เชŸเชพ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ. เชคเซเชฏเชพเช‚ เชฎเซ‡เช‚ เช–เชฐเซ‡เช–เชฐ เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชตเซƒเช•เซเชทเซ‹ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซเชฏเซเช‚ เชจ เชนเชคเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชถเซ‹เชงเชตเชพเชจเซ€, เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชจเซ€, เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เชธเช‚เชฌเช‚เชงเชฟเชค เชจ เชนเชคเซ€. เชนเชตเซ‡ เชฎเซ‡เช‚ เชตเซƒเช•เซเชทเซ‹ เชตเชฟเชถเซ‡ เชเช• เชฒเซ‡เช– เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เช•เชฆเชพเชš เช…เชฎเซ‡ เชถเชฐเซ‚ เช•เชฐเซ€เชถเซเช‚.

เชตเซƒเช•เซเชท เช เชเช• เชกเซ‡เชŸเชพ เชฎเชพเชณเช–เซเช‚ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชงเชพเชฐ เชฆเซเชตเชพเชฐเชพ เชœเซ‹เชกเชพเชฏเซ‡เชฒเชพ เช—เชพเช‚เช เซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เช†เชชเชฃเซ‡ เช•เชนเซ€ เชถเช•เซ€เช เช•เซ‡ เชตเซƒเช•เซเชท เช เช†เชฒเซ‡เช–เชจเซ‹ เชตเชฟเชถเซ‡เชท เช•เซ‡เชธ เช›เซ‡. เช…เชนเซ€เช‚ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เชตเซƒเช•เซเชท เช›เซ‡:

เชฌเชพเชˆเชจเชฐเซ€ เชŸเซเชฐเซ€ เช…เชฅเชตเชพ เชฌเชพเชˆเชจเชฐเซ€ เชธเชฐเซเชš เชŸเซเชฐเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเซ€

เช† เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชถเซ‹เชง เชตเซƒเช•เซเชท เชจเชฅเซ€! เชฌเชงเซเช‚ เช•เชŸ เชนเซ‡เช เชณ เช›เซ‡!

เชชเชฐเชฟเชญเชพเชทเชพ

เชฐเซเชŸ

เชตเซƒเช•เซเชท เชฎเซ‚เชณ เชŸเซ‹เชšเชจเซ‹ เชจเซ‹เชก เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เช† เชจเซ‹เชก A เช›เซ‡. เชตเซƒเช•เซเชทเชฎเชพเช‚, เชซเช•เซเชค เชเช• เชœ เชฐเชธเซเชคเซ‹ เชฎเซ‚เชณเชฎเชพเช‚เชฅเซ€ เช…เชจเซเชฏ เชจเซ‹เชก เชคเชฐเชซ เชฒเชˆ เชœเชˆ เชถเช•เซ‡ เช›เซ‡! เชนเช•เซ€เช•เชคเชฎเชพเช‚, เช•เซ‹เชˆเชชเชฃ เชจเซ‹เชกเชจเซ‡ เช† เชจเซ‹เชกเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชธเชฌเชŸเซเชฐเซ€เชจเชพ เชฎเซ‚เชณ เชคเชฐเซ€เช•เซ‡ เช—เชฃเซ€ เชถเช•เชพเชฏ.

เชฎเชพเชคเชพเชชเชฟเชคเชพ/เชธเช‚เชคเชพเชจ

เชฐเซเชŸ เชธเชฟเชตเชพเชฏเชจเชพ เชคเชฎเชพเชฎ เช—เชพเช‚เช เซ‹เชฎเชพเช‚ เชฌเชฐเชพเชฌเชฐ เชเช• เชงเชพเชฐ เชนเซ‹เชฏ เช›เซ‡ เชœเซ‡ เชฌเซ€เชœเชพ เชจเซ‹เชก เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชพเชฏ เช›เซ‡. เชตเชฐเซเชคเชฎเชพเชจ เชจเซ‹เชกเชจเซ€ เช‰เชชเชฐเชจเซ‹ เชจเซ‹เชก เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡ เชชเชฟเชคเซƒ เช† เชจเซ‹เชก. เชตเชฐเซเชคเชฎเชพเชจเชจเซ€ เชจเซ€เชšเซ‡ เชธเซเชฅเชฟเชค เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เชจเซ‹เชก เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡ เชตเช‚เชถเชœ เช† เชจเซ‹เชก. เชšเชพเชฒเซ‹ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เชฒเชˆเช. เชจเซ‹เชก B เชฒเซ‹, เชชเช›เซ€ เชคเซ‡เชจเชพ เชฎเชพเชคเชพเชชเชฟเชคเชพ เชจเซ‹เชก A เชนเชถเซ‡, เช…เชจเซ‡ เชคเซ‡เชจเชพ เชฌเชพเชณเช•เซ‹ เช—เชพเช‚เช เซ‹ D, E เช…เชจเซ‡ F เชนเชถเซ‡.

เชฒเซ€เชซ

เชเช• เช—เชพเช‚เช  เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เช•เซ‹เชˆ เชฌเชพเชณเช•เซ‹ เชจเชฅเซ€ เชคเซ‡เชจเซ‡ เชเชพเชกเชจเซเช‚ เชชเชพเชจ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เช—เชพเช‚เช เซ‹ D, E, F, G, I, J, K เชชเชพเช‚เชฆเชกเชพ เชนเชถเซ‡.

เช† เชฎเซ‚เชณเชญเซ‚เชค เชชเชฐเชฟเชญเชพเชทเชพ เช›เซ‡. เช…เชจเซเชฏ เชตเชฟเชญเชพเชตเชจเชพเช“ เชชเช›เซ€เชฅเซ€ เชšเชฐเซเชšเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชคเซ‡เชฅเซ€, เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชตเซƒเช•เซเชท เช เชเช• เชตเซƒเช•เซเชท เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชฆเชฐเซ‡เช• เชจเซ‹เชกเชฎเชพเช‚ เชฌเซ‡ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชฌเชพเชณเช•เซ‹ เชนเชถเซ‡ เชจเชนเซ€เช‚. เชคเชฎเซ‡ เช…เชจเซเชฎเชพเชจ เชฒเช—เชพเชตเซเชฏเซเช‚ เช›เซ‡ เชคเซ‡เชฎ, เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚เชฅเซ€ เชตเซƒเช•เซเชท เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชจเชนเซ€เช‚ เชนเซ‹เชฏ, เช•เชพเชฐเชฃ เช•เซ‡ เช—เชพเช‚เช เซ‹ 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;
    }
//...ะพัั‚ะฐะปัŒะฝั‹ะต ะผะตั‚ะพะดั‹ ัƒะทะปะฐ
}

เชฆเชฐเซ‡เช• เชจเซ‹เชกเชฎเชพเช‚ เชฌเซ‡ เชฌเชพเชณเช•เซ‹ เชนเซ‹เชฏ เช›เซ‡ (เชคเซ‡ เชคเชฆเซเชฆเชจ เชถเช•เซเชฏ เช›เซ‡ เช•เซ‡ เชฒเซ‡เชซเซเชŸ เชšเชพเช‡เชฒเซเชก เช…เชจเซ‡/เช…เชฅเชตเชพ เชฐเชพเช‡เชŸ เชšเชพเช‡เชฒเซเชก เชฌเชพเชณเช•เซ‹ เชจเชฒ เชนเชถเซ‡). เชคเชฎเซ‡ เช•เชฆเชพเชš เชธเชฎเชœเซ€ เช—เชฏเชพ เช›เซ‹ เช•เซ‡ เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชจเช‚เชฌเชฐ เชกเซ‡เชŸเชพ เชจเซ‹เชกเชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เชกเซ‡เชŸเชพ เช›เซ‡; เช•เซ€ - เชจเซ‹เชก เช•เซ€.

เช…เชฎเซ‡ เช—เชพเช‚เช  เชถเซ‹เชงเซ€ เช•เชพเชขเซ€ เช›เซ‡, เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชตเซƒเช•เซเชทเซ‹ เชตเชฟเชถเซ‡เชจเซ€ เชธเชฎเชธเซเชฏเชพเช“ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เช. เช…เชนเซ€เช‚ เช…เชจเซ‡ เชจเซ€เชšเซ‡, "เชตเซƒเช•เซเชท" เชถเชฌเซเชฆเชจเซ‹ เช…เชฐเซเชฅ เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชถเซ‹เชง เชตเซƒเช•เซเชทเชจเซ‹ เช–เซเชฏเชพเชฒ เชนเชถเซ‡. เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชตเซƒเช•เซเชทเชจเซ€ เชฐเชšเชจเชพ:

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

เชœเซ‹ เชตเชฐเซเชคเชฎเชพเชจ เชถเซ‚เชจเซเชฏ เชฌเชจเซ‡ เช›เซ‡, เชคเซ‹ เชชเช›เซ€ เชชเซเชจเชฐเชพเชตเซƒเชคเซเชคเชฟ เชตเซƒเช•เซเชทเชจเชพ เช…เช‚เชค เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซ€ เช—เชˆ เช›เซ‡ (เชตเซˆเชšเชพเชฐเชฟเช• เชธเซเชคเชฐเซ‡, เชคเชฎเซ‡ เชเชพเชกเชฎเชพเช‚ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชจ เชนเซ‹เชฏ เชคเซ‡เชตเชพ เชธเซเชฅเชพเชจเซ‡ เช›เซ‹ - เชเช• เชชเชพเช‚เชฆเชกเชพเชจเซเช‚ เชฌเชพเชณเช•).

เชธเช‚เชคเซเชฒเชฟเชค เชตเซƒเช•เซเชท เชชเชฐ เชถเซ‹เชง เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‹ (เชเช• เชตเซƒเช•เซเชท เชœเซ‡เชฎเชพเช‚ เช—เชพเช‚เช เซ‹ เชตเชงเซ เช•เซ‡ เช“เช›เชพ เชธเชฎเชพเชจเชฐเซ‚เชชเซ‡ เชตเชฟเชคเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡). เชชเช›เซ€ เชถเซ‹เชง เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ O(log(n)), เช…เชจเซ‡ เช†เชงเชพเชฐ 2 เชฒเช˜เซเช—เชฃเช• เชนเชถเซ‡. เชœเซเช“: เชœเซ‹ เชธเช‚เชคเซเชฒเชฟเชค เชตเซƒเช•เซเชทเชฎเชพเช‚ n เชคเชคเซเชตเซ‹ เชนเซ‹เชฏ, เชคเซ‹ เชคเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช เช•เซ‡ เชตเซƒเช•เซเชทเชจเชพ log(n) เช†เชงเชพเชฐ 2 เชธเซเชคเชฐเซ‹ เชนเชถเซ‡. เช…เชจเซ‡ เชถเซ‹เชงเชฎเชพเช‚, เชšเช•เซเชฐเชจเชพ เชเช• เชชเช—เชฒเชพ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เชเช• เชธเซเชคเชฐ เชจเซ€เชšเซ‡ เชœเชพเช“ เช›เซ‹.

เชธเชพเชฎเซ‡เชฒ

เชœเซ‹ เชคเชฎเซ‡ เชถเซ‹เชงเชจเซ‹ เชธเชพเชฐ เชธเชฎเชœเซ€ เชฒเซ€เชงเซ‹ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชจเชฟเชตเซ‡เชถเชจเซ‡ เชธเชฎเชœเชตเซเช‚ เชฎเซเชถเซเช•เซ‡เชฒ เชจเชนเซ€เช‚ เชนเซ‹เชฏ. เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชเชพเชกเชจเชพ เชชเชพเช‚เชฆเชกเชพ เชชเชฐ เชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เชถเซ‹เชงเชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชตเช‚เชถเชจเชพ เชจเชฟเชฏเชฎเซ‹ เช…เชจเซเชธเชพเชฐ) เช…เชจเซ‡ เชคเซ‡เชจเชพ เชตเช‚เชถเชœ เชฌเชจเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ - เชกเชพเชฌเซ‡ เช…เชฅเชตเชพ เชœเชฎเชฃเซ‡, เช•เซ€เชจเชพ เช†เชงเชพเชฐเซ‡. เช…เชฎเชฒเซ€เช•เชฐเชฃ:

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

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชตเชฐเซเชคเชฎเชพเชจ เชจเซ‹เชก เช‰เชชเชฐเชพเช‚เชค, เชตเชฐเซเชคเชฎเชพเชจ เชจเซ‹เชกเชจเชพ เชชเชฟเชคเซƒ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเซ€ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชจเชฒ เชฌเชจเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชชเซ‡เชฐเซ‡เชจเซเชŸ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เช†เชชเชฃเชจเซ‡ เชœเซ‹เชˆเชคเซ€ เชถเซ€เชŸ เชนเชถเซ‡.
เชจเชฟเชตเซ‡เชถ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชฆเซ‡เช–เซ€เชคเซ€ เชฐเซ€เชคเซ‡ เชถเซ‹เชง - O(log(n)) เชœเซ‡เชตเซ€ เชœ เชนเชถเซ‡.

เช•เชพเชขเซ€ เชจเชพเช‚เช–เซ‹

เช•เชพเชขเซ€ เชจเชพเช–เชตเซเช‚ เช เชธเซŒเชฅเซ€ เชœเชŸเชฟเชฒ เช•เชพเชฎเช—เซ€เชฐเซ€ เช›เซ‡ เชœเซ‡ เชตเซƒเช•เซเชท เชธเชพเชฅเซ‡ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ เชธเซŒ เชชเซเชฐเชฅเชฎ เชคเซ‡ เชคเชคเซเชต เชถเซ‹เชงเชตเชพเชจเซเช‚ เชœเชฐเซ‚เชฐเซ€ เชฐเชนเซ‡เชถเซ‡ เชœเซ‡เชจเซ‡ เช†เชชเชฃเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพ เชœเชˆ เชฐเชนเซเชฏเชพ เช›เซ€เช. เชชเชฃ เชชเช›เซ€ เชถเซเช‚? เชœเซ‹ เช†เชชเชฃเซ‡ เชคเซ‡เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เช–เชพเชฒเซ€ เชจเชฒ เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ€เช, เชคเซ‹ เช†เชชเชฃเซ‡ เชธเชฌเชŸเซเชฐเซ€ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เช—เซเชฎเชพเชตเซ€เชถเซเช‚ เช•เซ‡ เชœเซ‡เชจเชพ เชฎเซ‚เชณ เช† เชจเซ‹เชก เช›เซ‡. เชเชพเชก เชฆเซ‚เชฐ เช•เชฐเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เชคเซเชฐเชฃ เช•เซ‡เชธเซ‹เชฎเชพเช‚ เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒเซ€ เช›เซ‡.

เชชเซเชฐเชฅเชฎ เช•เซ‡เชธ. เชฆเซ‚เชฐ เช•เชฐเชตเชพเชจเชพ เชจเซ‹เชกเชฎเชพเช‚ เช•เซ‹เชˆ เชฌเชพเชณเช•เซ‹ เชจเชฅเซ€.

เชœเซ‹ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเชพ เชจเซ‹เชกเชฎเชพเช‚ เช•เซ‹เชˆ เชฌเชพเชณเช•เซ‹ เชจเชฅเซ€, เชคเซ‹ เชคเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช เช•เซ‡ เชคเซ‡ เชเช• เชชเชฐเซเชฃ เช›เซ‡. เชคเซ‡เชฅเซ€, เชคเชฎเซ‡ เชคเซ‡เชจเชพ เชชเซ‡เชฐเซ‡เชจเซเชŸเชจเชพ เชฒเซ‡เชซเซเชŸ เชšเชพเช‡เชฒเซเชก เช…เชฅเชตเชพ เชฐเชพเช‡เชŸ เชšเชพเช‡เชฒเซเชก เชซเซ€เชฒเซเชกเซเชธเชจเซ‡ เช–เชพเชฒเซ€ เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชฌเซ€เชœเซ‹ เช•เซ‡เชธ. เชฆเซ‚เชฐ เช•เชฐเชตเชพเชจเชพ เชจเซ‹เชกเชฎเชพเช‚ เชเช• เชฌเชพเชณเช• เช›เซ‡

เช† เช•เซ‡เชธ เชชเชฃ เชฌเชนเซ เชฎเซเชถเซเช•เซ‡เชฒ เชจเชฅเซ€. เชšเชพเชฒเซ‹ เช†เชชเชฃเชพ เช‰เชฆเชพเชนเชฐเชฃ เชชเชฐ เชชเชพเช›เชพ เชœเชˆเช. เชงเชพเชฐเซ‹ เช•เซ‡ เช†เชชเชฃเซ‡ เช•เซ€ 14 เชธเชพเชฅเซ‡ เชเช• เช˜เชŸเช•เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชธเช‚เชฎเชค เชฅเชพเช“ เช•เซ‡ เชคเซ‡ เช•เซ€ 10 เชตเชพเชณเชพ เชจเซ‹เชกเชจเซเช‚ เชœเชฎเชฃเซเช‚ เชฌเชพเชณเช• เช›เซ‡, เชคเซ‹ เชคเซ‡เชจเชพ เช•เซ‹เชˆเชชเชฃ เชตเช‚เชถเชœ (เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชœเชฎเชฃเซ€ เชฌเชพเชœเซ) เชชเชพเชธเซ‡ 10 เช•เชฐเชคเชพ เชฎเซ‹เชŸเซ€ เช•เซ€ เชนเชถเซ‡, เชคเซ‡เชฅเซ€ เชคเซ‡เชจเซ‡ เชตเซƒเช•เซเชทเชฎเชพเช‚เชฅเซ€ เชธเชฐเชณเชคเชพเชฅเซ€ "เช•เชพเชชเซ€" เชถเช•เชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชฎเชพเชคเชพเชชเชฟเชคเชพเชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชจเซ‹เชกเชจเชพ เชฌเชพเชณเช• เชธเชพเชฅเซ‡ เชธเซ€เชงเชพ เชœ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. i. เชจเซ‹เชกเชจเซ‡ เช•เซ€ 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, เชฐเชฟเช•เชฐเซเชเชจ, เชกเซ‡เชŸเชพ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ, เชตเช—เซ‡เชฐเซ‡)

  • เชตเชพเชธเซเชคเชตเชฟเช• เชœเซ€เชตเชจเชฎเชพเช‚ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เช…เชจเซ‡ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช—

  • เชœเชพเชตเชพเชฎเชพเช‚ เชเชจเซเชกเซเชฐเซ‹เช‡เชก เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซเช‚ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—

  • เชœเชพเชตเชพ เชตเซ‡เชฌ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—

2 เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เช เชฎเชค โ€‹โ€‹เช†เชชเซเชฏเซ‹. 1 เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฆเซ‚เชฐ เชฐเชนเซเชฏเซ‹.

เชธเซเชคเซเชฐเซ‹เชค: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹