Prelude
เบเบปเบเบเบงเบฒเบกเบเบตเปเปเบกเปเบเบเปเบฝเบงเบเบฑเบเบเบปเปเบเปเบกเปเบเบปเปเบเบซเบฒเบเบนเป. เบเปเปเบเบปเบเบกเบฒเบเบตเปเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบฎเบฑเบเบเบปเบเบเบงเบฒเบกเบเปเบฝเบงเบเบฑเบ
เบเบปเปเบเปเบกเปเปเบกเปเบเปเบเบเบชเปเบฒเบเบเปเปเบกเบนเบเบเบตเปเบเบฐเบเบญเบเบเปเบงเบเบเปเปเบเบตเปเปเบเบทเปเบญเบกเบเปเปเบเบฑเบเบเปเบงเบเบเบญเบ. เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบงเบปเปเบฒเปเบเปเบงเปเบฒเบเบปเปเบเปเบกเปเปเบเบฑเบเบเปเบฅเบฐเบเบตเบเบดเปเบชเบเบเบญเบเบเบฒเบ. เบเบตเปเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบเบปเปเบเปเบกเป:
เบเบตเปเบเปเปเปเบกเปเบเบเบปเปเบเปเบกเปเบเบญเบเบซเบฒเบเบนเป! เบเบธเบเบขเปเบฒเบเบเบทเบเบเบฑเบ!
Terminology
เบฎเบฒเบ
เบฎเบฒเบเบเบปเปเบเปเบกเป - เบเบตเปเปเบกเปเบเบเปเปเบชเบนเบเบชเบธเบเบเบญเบเบกเบฑเบ. เปเบเบเบปเบงเบขเปเบฒเบ, เบเบตเปเปเบกเปเบ node A. เปเบเบเบปเปเบเปเบกเป, เบเบฝเบเปเบเปเปเบชเบฑเปเบเบเบฒเบเบเบฝเบงเบชเบฒเบกเบฒเบเบเปเบฒเบเบฒเบเบฎเบฒเบเปเบเบซเบฒเบเปเปเบญเบทเปเบเป! เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, node เปเบเบชเบฒเบกเบฒเบเบเบทเบเบเบดเบเบฒเบฅเบฐเบเบฒเปเบเบฑเบเบฎเบฒเบเบเบญเบเบเบปเปเบเปเบกเปเบเปเบญเบเบเบตเปเบชเบญเบเบเปเบญเบเบเบฑเบเบเบฑเบ node เบเบตเป.
เบเปเปเปเบกเป/เบฅเบนเบเบซเบฅเบฒเบ
เบเบธเบเป nodes เบเบปเบเปเบงเบฑเปเบ root เบกเบตเปเบเบเบญเบฑเบเบเบฝเบงเบเบตเปเบเปเบฒเปเบเบชเบนเป node เบญเบทเปเบ. เปเบซเบเบเบเบตเปเบขเบนเปเบเปเบฒเบเปเบเบดเบเบเบญเบเบเบฐเบเบธเบเบฑเบเปเบกเปเบเปเบญเบตเปเบเบงเปเบฒ เบเปเปเปเบกเป node เบเบตเป. เปเบซเบเบเบเบตเปเบขเบนเปเบเปเบฒเบเบฅเบธเปเบกเบเบญเบเบเบฐเบเบธเบเบฑเบเปเบฅเบฐเปเบเบทเปเบญเบกเบเปเปเบเบฑเบเบกเบฑเบเบเบทเบเปเบญเบตเปเบเบงเปเบฒ เปเบเบทเปเบญเบชเบฒเบ node เบเบตเป. เปเบซเปเปเบเปเบเบปเบงเบขเปเบฒเบ. เปเบซเปเปเบญเบปเบฒ node B, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเปเปเบกเปเบเบญเบเบกเบฑเบเบเบฐเปเบเบฑเบ node A, เปเบฅเบฐเบฅเบนเบเบเบญเบเบกเบฑเบเบเบฐเปเบเบฑเบ nodes D, E เปเบฅเบฐ F.
Leaf
เบเปเปเบเบตเปเบเปเปเบกเบตเบฅเบนเบเบเบฐเบเบทเบเปเบญเบตเปเบเบงเปเบฒเปเบเบเบญเบเบเบปเปเบเปเบกเป. เปเบเบเบปเบงเบขเปเบฒเบ, เปเบเบเบฐเปเบเบฑเบ nodes D, E, F, G, I, J, K.
เบเบตเปเปเบกเปเบ เบเบณ เบชเบฑเบเบเบทเปเบเบเบฒเบ. เปเบเบงเบเบงเบฒเบกเบเบดเบเบญเบทเปเบเปเบเบฐเบเบทเบเบเบถเบเบชเบฒเบซเบฒเบฅเบทเบเบทเปเบกเบญเบตเบ. เบเบฑเปเบเบเบฑเปเบ, เบเบปเปเบเปเบกเปเบเบนเปเปเบกเปเบเบเบปเปเบเปเบกเปเบเบตเปเปเบเปเบฅเบฐ node เบเบฐเบกเบตเบฅเบนเบเบเปเปเปเบเบตเบเบชเบญเบเบเบปเบ. เบเบฒเบกเบเบตเปเบเปเบฒเบเบเบฒเบเปเบเบปเบฒ, เบเบปเปเบเปเบกเปเบเบฒเบเบเบปเบงเบขเปเบฒเบเบเบฐเบเปเปเปเบเบฑเบเบเบนเป, เปเบเบฒเบฐเบงเปเบฒ nodes B เปเบฅเบฐ H เบกเบตเบซเบผเบฒเบเบเบงเปเบฒเบชเบญเบเบฅเบนเบ. เบเบตเปเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบเบญเบเบเบปเปเบเปเบกเปเบเบนเป:
เบเปเปเบเบญเบเบเบปเปเบเปเบกเปเบชเบฒเบกเบฒเบเบกเบตเบเปเปเบกเบนเบเปเบเป. เบเบปเปเบโเปเบกเปโเบเบปเปเบโเบซเบฒโเบเบฒเบโเบชเบญเบโเปเบเบฑเบโเบเบปเปเบโเปเบกเปโเบเบนเปโเบเบตเปโเบกเบตโเบเบธเบโเบชเบปเบกโเบเบฑเบโเบเบฑเปเบโเบเปเปโเปเบโเบเบตเปโ:
- เบเบฑเบเบเบปเปเบเปเบกเปเบเปเบญเบเบเปเบฒเบเปเบฅเบฐเบเบงเบฒเปเบกเปเบเบเบปเปเบเปเบกเปเบเบปเปเบเบซเบฒเบเบนเป.
- nodes เบเบฑเบเบซเบกเบปเบเบเบญเบ subtree เบเปเบฒเบเบเบญเบ node arbitrary X เบกเบตเบกเบนเบเบเปเบฒเบเบตเปเบชเปเบฒเบเบฑเบเบเปเปเบกเบนเบเบซเบเปเบญเบเบเปเบงเบฒเบกเบนเบเบเปเบฒเบเบญเบเบเปเปเบกเบนเบเบเบญเบ node X เบเบปเบงเบเบญเบเบกเบฑเบเปเบญเบ.
- เบเบธเบเป nodes เปเบ subtree เบเบตเปเบเบทเบเบเปเบญเบเบเบญเบ node X arbitrary เบกเบตเบกเบนเบเบเปเบฒเบเปเปเบกเบนเบเบเบตเปเบชเปเบฒเบเบฑเบเบซเบผเบฒเบเบเปเบงเบฒเบซเบผเบทเปเบเบปเปเบฒเบเบฑเบเบกเบนเบเบเปเบฒเบเบญเบเบเปเปเบกเบนเบเบเบญเบ node X เบเบปเบงเบเบญเบเบกเบฑเบเปเบญเบ.
Key โ เบฅเบฑเบโเบชเบฐโเบเบฐโเปเบโเบซเบเบถเปเบโเบเบญเบ node (เบชเปเบฒโเบฅเบฑเบโเบเบปเบงโเบขเปเบฒเบโ, เบเปเบฒโเบเบงเบโเบซเบเบถเปเบโ)โ. เบเบธเบเปเบเปเบกเปเบเบเปเบฒเปเบเบฑเบเปเบเบทเปเบญเปเบซเปเปเบเบปเปเบฒเบชเบฒเบกเบฒเบเบเบญเบเบซเบฒเบญเบปเบเบเบฐเบเบญเบเบเบปเปเบเปเบกเปเบเบตเปเบเบฐเปเบเบเบตเปเบเบปเบเบเบฑเบ. เบเบปเบงเบขเปเบฒเบเบเบญเบเบเบปเปเบเปเบกเปเบเบญเบเบซเบฒเบเบนเป:
เบเบฑเบเบชเบฐเบเบฐเบเบปเปเบเปเบกเป
เปเบเบเบฐเบเบฐเบเบตเปเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบงเบฒเบกเบเบทเบเบซเบเปเบฒ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบชเบฐเบซเบเบญเบเบเบฒเบเบชเปเบงเบ (เบญเบฒเบเบเบฐเบเปเปเบเบปเบเบเปเบงเบ) เบเบญเบเบฅเบฐเบซเบฑเบเปเบเบทเปเบญเบเบฑเบเบเบธเบเบเบงเบฒเบกเปเบเบปเปเบฒเปเบเบเบญเบเบเปเบฒเบ. เบฅเบฐเบซเบฑเบเปเบเบฑเบกเบเบฐเบขเบนเปเปเบเบเบญเบเบเปเบฒเบเบเบญเบเบเบปเบเบเบงเบฒเบก.
เบเบปเปเบเปเบกเปเบเบฐเบเบญเบเบเปเบงเบเบเปเป. เปเบเบเบชเปเบฒเบเบเบญเบเปเบเบ:
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;
}
//...ะพััะฐะปัะฝัะต ะผะตัะพะดั ัะทะปะฐ
}
เปเบเปเบฅเบฐ node เบกเบตเบชเบญเบเบฅเบนเบ (เบกเบฑเบเปเบเบฑเบเปเบเปเบเปเบเปเบญเบเบเปเบฒเบเบงเปเบฒเบฅเบนเบเบเปเบฒเบเปเบฅเบฐ/เบซเบผเบทเบฅเบนเบเบเบงเบฒเบเบฐเบกเบตเบเปเบฒ null). เบเปเบฒเบเบญเบฒเบเบเบฐเบฎเบนเปเบงเปเบฒเปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเปเปเบกเบนเบเบเบปเบงเปเบฅเบเปเบกเปเบเบเปเปเบกเบนเบเบเบตเปเปเบเบฑเบเปเบงเปเปเบ node; key โ node key.
เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบญเบญเบ knot, เปเบเบเบฑเบเบเบธเบเบฑเบเปเบซเปเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบปเบเบเบฑเบเบเบฑเบเบซเบฒเบเปเบฝเบงเบเบฑเบเบเบปเปเบเปเบกเป. เบเปเปเปเบเบเบตเป, เปเบเบเบเปเบฒเบงเปเบฒ "เบเบปเปเบเปเบกเป" เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบซเบกเบฒเบเปเบเบดเบเปเบเบงเบเบงเบฒเบกเบเบดเบเบเบญเบเบเบปเปเบเปเบกเปเบเบปเปเบเบซเบฒเบเบนเป. เปเบเบโเบชเปเบฒเบโเบเบปเปเบโเปเบกเปโเบชเบญเบโ:
public class BinaryTree<T> {
private Node<T> root;
//ะผะตัะพะดั ะดะตัะตะฒะฐ
}
เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเบฝเบเปเบเปเบฎเบฒเบเบเบญเบเบเบปเปเบเปเบกเปเปเบเบฑเบเบเบฒเบเบชเบฐเบซเบเบฒเบก, เปเบเบฒเบฐเบงเปเบฒเบเบฒเบเบฎเบฒเบ, เบเบฒเบเบเปเบฒเปเบเปเบงเบดเบเบตเบเบฒเบ getLeftChild() เปเบฅเบฐ getRightChild(), เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบซเบฒ node เปเบเปเบเบเบปเปเบเปเบกเป.
เบชเบนเบเบเบฒเบเบเบดเบเปเบฅเปเปเบเบเบปเปเบเปเบกเป
ะะพะธัะบ
เปเบซเปเปเบงเบปเปเบฒเบงเปเบฒเบเปเบฒเบเบกเบตเบเบปเปเบเปเบกเปเบเปเปเบชเปเบฒเบ. เบงเบดเบเบตเบเบฒเบเบเบญเบเบซเบฒเบญเบปเบเบเบฐเบเบญเบเบเบตเปเบกเบตเบเบตเบเบตเปเบชเปเบฒเบเบฑเบ? เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเปเบฒเบเบเบฒเบกเบฅเปเบฒเบเบฑเบเบเบฒเบเบฎเบฒเบเบฅเบปเบเบฅเบธเปเบกเบเบปเปเบเปเบกเปเปเบฅเบฐเบเบฝเบเบเบฝเบเบกเบนเบเบเปเบฒเบเบญเบเบเบตเบเบฑเบเบเบธเบเปเบเบเบญเบเปเบซเบเบเบเปเปเปเบ: เบเปเบฒเบเบตเปเบกเปเบเบซเบเปเบญเบเบเบงเปเบฒเบเบฐเปเบเบเบญเบเปเบซเบเบเบเปเปเปเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบเบซเบฒเบฅเบนเบเบซเบฅเบฒเบเบเปเบฒเบเบเบญเบเปเบซเบเบ, เบเปเบฒเบกเบฑเบเปเบเบฑเบ. เบเบดเปเบเปเบซเบเปเบเบงเปเบฒ, เปเบเบเบฒเบเบเบงเบฒ, เบเปเบฒเบเบฐเปเบเปเบกเปเบเปเบเบปเปเบฒเบเบฑเบ, เปเบเบเบเบตเปเบเปเบญเบเบเบฒเบเบเบฐเบเบปเบเปเบซเบฑเบ! เบฅเบฐเบซเบฑเบเบเบตเปเบเปเบฝเบงเบเปเบญเบ:
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;
}
เบเปเบฒเบเบฐเบเบธเบเบฑเบเบเบฒเบเปเบเบฑเบ null, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบฒเบเบเบปเปเบเบซเบฒเปเบเปเบกเบฒเบฎเบญเบเบเบธเบเบชเบดเปเบเบชเบธเบเบเบญเบเบเบปเปเบเปเบกเป (เปเบเบฅเบฐเบเบฑเบเปเบเบงเบเบงเบฒเบกเบเบดเบ, เบเปเบฒเบเบขเบนเปเปเบเบชเบฐเบเบฒเบเบเบตเปเบเบตเปเบเปเปเบกเบตเบขเบนเปเปเบเบเบปเปเบเปเบกเป - เปเบเบฑเบเบฅเบนเบเบซเบฅเบฒเบเบเบญเบเปเบ).
เปเบซเปเบเบดเบเบฒเบฅเบฐเบเบฒเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบญเบเบงเบดเบเบตเบเบฒเบเบเบปเปเบเบซเบฒเปเบเบเบปเปเบเปเบกเปเบเบตเปเบชเบปเบกเบเบนเบ (เบเบปเปเบเปเบกเปเบเบตเป nodes เบเบทเบเปเบเบเบขเบฒเบเบซเบผเบฒเบเบซเบผเบทเบซเบเปเบญเบเปเบเบปเปเบฒเบเบฝเบกเบเบฑเบ). เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบฒเบเบเบญเบเบซเบฒเบเบฐเปเบเบฑเบ O(log(n)), เปเบฅเบฐ logarithm เปเบกเปเบเบเบฒเบ 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;
}
}
}
}
}
เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเบญเบเปเบซเบเบทเบญเบเบฒเบ node เปเบเบเบฑเบเบเบธเบเบฑเบ, เบกเบฑเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเบเปเปเบกเบนเบเบเปเบฝเบงเบเบฑเบ parent เบเบญเบ node เบเบฐเบเบธเบเบฑเบ. เปเบกเบทเปเบญเบเบฑเบเบเบธเบเบฑเบเบเบฒเบเปเบเบฑเบ null, เบเบปเบงเปเบเบซเบผเบฑเบเบเบฐเบกเบตเบเบตเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบ.
เบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบญเบเบเบฒเบเปเบเบเปเบกเปเบเปเบเปเบเบญเบเบเบทเบเบฑเบเบเบฑเบเบเบฒเบเบเบปเปเบเบซเบฒ - O(log(n)).
เบฅเบปเบ
เบเบฒเบเปเบเบเบเปเบฒเบเปเบกเปเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบตเปเบเบฒเบเบเบตเปเบชเบธเบเบเบตเปเบเบฐเบเปเบญเบเปเบเปเบเบฐเบเบดเบเบฑเบเบขเบนเปเปเบเบดเบเบเบปเปเบเปเบกเป. เบกเบฑเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเบงเปเบฒเบเปเบฒเบญเบดเบเบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบญเบเบเบญเบเบซเบฒเบญเบปเบเบเบฐเบเบญเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบฅเบถเบ. เปเบเปเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบกเปเบเบซเบเบฑเบ? เบเปเบฒเบเบงเบเปเบฎเบปเบฒเบเบฝเบเปเบเปเบเบฑเปเบเบเบฒเบเบญเปเบฒเบเบญเบตเบเบเบญเบเบกเบฑเบเปเบเบฑเบ null, เบเบงเบเปเบฎเบปเบฒเบเบฐเบชเบนเบเปเบชเบเบเปเปเบกเบนเบเบเปเบฝเบงเบเบฑเบเบเบปเปเบเปเบกเปเบเปเบญเบเบเบตเป node เบเบตเปเปเบกเปเบเบฎเบฒเบ. เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบฑเบเบเบปเปเบเปเบกเปเปเบเปเบเบญเบญเบเปเบเบฑเบเบชเบฒเบกเบเปเบฅเบฐเบเบต.
เบเปเบฅเบฐเบเบตเบเปเบฒเบญเบดเบ. เปเบเบเบเบตเปเบเบทเบเบฅเบถเบเบเปเปเบกเบตเบฅเบนเบ
เบเปเบฒเบเปเปเบเบตเปเบเบทเบเบฅเบถเบเบเปเปเบกเบตเบฅเบนเบ, เบเบตเปเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเบกเบฑเบเปเบเบฑเบเปเบ. เบเบฑเปเบเบเบฑเปเบ, เบเปเบฒเบเบเบฝเบเปเบเปเบชเบฒเบกเบฒเบเบเปเบฒเบเบปเบเบเปเบญเบเบเปเบฒเบเบฅเบนเบเบซเบผเบทเบเบงเบฒเปเบเบฑเบเบเบญเบเบเปเปเปเบกเปเบเบญเบเบเบปเบเปเบเบฑเบ null.
เบเปเบฅเบฐเบเบตเบเบตเบชเบญเบ. เปเบซเบเบเบเบตเปเบเบฐเบฅเบถเบเบกเบตเบฅเบนเบเปเบถเปเบเบญเบฑเบ
เบเปเบฅเบฐเบเบตเบเบตเปเบเบฑเบเบเปเปเบชเบฑเบเบชเบปเบเบซเบผเบฒเบ. เปเบซเปเบเบฑเบเบเบทเบเปเบเบซเบฒเบเบปเบงเบขเปเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ. เบชเบปเบกเบกเบธเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบฅเบถเบเบญเบปเบเบเบฐเบเบญเบเบเบตเปเบกเบตเบเบต 14. เบเบปเบเบฅเบปเบเปเบซเบฑเบเบเบตเบงเปเบฒเปเบเบทเปเบญเบเบเบฒเบเบกเบฑเบเปเบเบฑเบเบฅเบนเบเบซเบฅเบฒเบเบเบตเปเบเบทเบเบเปเบญเบเบเบญเบเปเบซเบเบเบเบตเปเบกเบตเบเบธเบเปเบ 10, เบเบฑเปเบเบเบฑเปเบเบฅเบนเบเบซเบฅเบฒเบเบเบญเบเบกเบฑเบ (เปเบเบเปเบฅเบฐเบเบตเบเบตเปเปเบกเปเบเบญเบฑเบเบเบตเปเบเบทเบเบเปเบญเบ) เบเบฐเบกเบตเบฅเบฐเบซเบฑเบเปเบซเบเปเบเบงเปเบฒ 10, เบเบฑเปเบเบเบฑเปเบเปเบเบปเปเบฒ. เบชเบฒเบกเบฒเบ "เบเบฑเบ" เบกเบฑเบเบญเบญเบเบเบฒเบเบเบปเปเบเปเบกเปเปเบเปเบขเปเบฒเบเบเปเบฒเบเบเบฒเบ, เปเบฅเบฐเปเบเบทเปเบญเบกเบเปเปเบเปเปเปเบกเปเปเบเบเบเบปเบเบเบฑเบเบฅเบนเบเบเบญเบ node เบเบตเปเบเบทเบเบฅเบถเบ, i.e. เปเบเบทเปเบญเบกเบเปเป node เบเบฑเบ key 10 เบเบฑเบ node 13. เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบฐเบเปเบฒเบเบเบทเบเบฑเบเบเปเบฒเบกเบฑเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบถเบ node เบเบตเปเปเบเบฑเบเบฅเบนเบเบเปเบฒเบเบเบญเบเบเปเปเปเบกเปเบเบญเบเบกเบฑเบ. เบเบดเบเบเปเบฝเบงเบเบฑเบเบกเบฑเบเบเบปเบงเบเปเบฒเบเปเบญเบ - เบเบฒเบเบเบฝเบเบเบฝเบเบเบตเปเปเบเปเบเบญเบ.
เบเปเบฅเบฐเบเบตเบเบตเบชเบฒเบก. A node เบกเบตเบชเบญเบเบฅเบนเบ
เบเปเบฅเบฐเบเบตเบเบตเปเบเบฒเบเบเบตเปเบชเบธเบ. เปเบซเปเปเบเบดเปเบเบเบปเบงเบขเปเบฒเบเปเบซเบกเป.
เบเบญเบเบซเบฒเบเบนเปเบชเบทเบเบเบญเบ
เบชเบปเบกเบกเบธเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบถเบ node เบเบตเปเบกเบต key 25. เบเบงเบเปเบฎเบปเบฒเบเบงเบเปเบชเปเปเบเปเบเบเบกเบฑเบ? เบซเบเบถเปเบเปเบเบเบนเปเบเบดเบเบเบฒเบกเบเบญเบเบฅเบฒเบง (เบฅเบนเบเบซเบฅเบฒเบเบซเบผเบทเบฅเบนเบเบซเบฅเบฒเบเบเบญเบเบฅเบนเบเบซเบฅเบฒเบ) เบเปเบญเบเบเบฒเบเปเบเบฑเบ เบเบนเปเบชเบทเบเบเบญเบ(เบเบนเปเบเบตเปเบเบฐเปเบญเบปเบฒเบชเบฐเบเบฒเบเบเบตเปเบเบญเบ node เบเบตเปเบเบทเบเปเบเบเบเปเบฒเบ).
เบงเบดเบเบตเบเบฒเบเปเบเบปเปเบฒเปเบเบงเปเบฒเปเบเบเบงเบเบเบฐเปเบเบฑเบเบเบนเปเบชเบทเบเบเบญเบ? เปเบเบ intuitively, เบเบตเปเปเบกเปเบ node เปเบเบเบปเปเบเปเบกเปเบเบตเปเบกเบตเบเบฐเปเบเบเบตเปเปเบซเบเปเบเบตเปเบชเบธเบเบเปเปเปเบเบเบฒเบ node เบเบตเปเบเบทเบเบฅเบถเบ. เบชเบนเบเบเบฒเบเบเบดเบเปเบฅเปเปเบกเปเบเบเบฑเปเบเบเปเปเปเบเบเบตเป. เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบซเบฒเบฅเบนเบเบซเบฅเบฒเบเบเบตเปเบเบทเบเบเปเบญเบเบเบญเบเบกเบฑเบ (เบชเบฐเปเบซเบกเบตเปเบเบเบฒเบเบเบงเบฒ, เปเบเบฒเบฐเบงเปเบฒเบกเบฑเบเปเบงเบปเปเบฒเปเบฅเปเบงเบงเปเบฒเบเบธเบเปเบเบชเบทเบเบเบญเบเปเบกเปเบเปเบซเบเปเบเบงเปเบฒเบเบธเบเปเบเบเบญเบเปเบซเบเบเบเบตเปเบเบทเบเบฅเบปเบ), เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบเบเปเบฒเบเบฅเบฐเบเบปเบเบเปเบญเบเปเบชเปเบเบญเบเบฅเบนเบเบซเบฅเบฒเบเบเปเบฒเบเบเบญเบเบฅเบนเบเบซเบฅเบฒเบเบเบงเบฒเบเบตเป. . เปเบเบเบปเบงเบขเปเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบซเบฒ node เบเบตเปเบกเบตเบฅเบฐเบซเบฑเบ 35, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบฅเบปเบเปเบเบซเบฒเปเบเบเปเบฒเบเบฅเบฐเบเบปเบเบเปเบญเบเปเบชเปเบเบญเบเบฅเบนเบเบเปเบฒเบเบเบญเบเบกเบฑเบ - เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบฅเบฐเบเบปเบเบเปเบญเบเปเบชเปเบเบตเปเบเบฐเบเบญเบเบเปเบงเบเบเบฝเบเปเบเป node เบเบตเปเบกเบตเบเบธเบเปเบ 30. เปเบงเบปเปเบฒเบขเปเบฒเบเปเบเบฑเปเบกเบเบงเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบญเบเบซเบฒ เบชเปเบฒเบฅเบฑเบ node เบเปเบญเบเบเบตเปเบชเบธเบเปเบเบเบธเบเบเบญเบ nodes เบเบฐเบซเบเบฒเบเปเบซเบเปเบเปเบงเบฒเบซเบเบถเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบญเบเบซเบฒ node.
เบฅเบฐเบซเบฑเบเบงเบดเบเบตเบเบฒเบเบเบปเปเบเบซเบฒเบเบนเปเบชเบทเบเบเบญเบ:
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))
Symmetrical bypass
Traversal เปเบกเปเบเบเบฒเบเบขเปเบฝเบกเบขเบฒเบกเปเบเปเบฅเบฐเบเปเปเบเบญเบเบเบปเปเบเปเบกเปเปเบเบทเปเบญเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฒเบเบขเปเบฒเบเบเบฑเบเบกเบฑเบ.
เบชเบนเบเบเบฒเบเบเบดเบเปเบฅเปเปเบฅเบเบฐเบซเปเบฒเบเบเบญเบเบชเบปเบกเบกเบฒเบเบฃเบดเบเปเบเบเบเปเบณเป:
- เบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฝเบงเบเบฑเบเปเบเบฑเบเบเปเบฒเบ
- เบเปเบฒเปเบเบตเบเบเบฒเบเบเบฑเบเบเบปเบงเบเปเบฒเบเปเบญเบ
- เบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฝเบงเบเบฑเบเปเบเบฑเบเบเปเบญเบเบเบตเปเบเบทเบเบเปเบญเบ
เบฅเบฐเบซเบฑเบ:
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
Degeneration เบเบฑเบ O(n)
เบซเบฅเบฒเบโเบเปเบฒเบโเบญเบฒเบโเบเบฐโเปเบเปโเบชเบฑเบโเปเบเบโเบงเปเบฒ: เบเปเบฒโเปเบเบปเปเบฒโเปเบฎเบฑเบโเปเบซเปโเบเบปเปเบโเปเบกเปโเบเปเปโเบชเบปเบกโเบเบธเบโเบเบฐโเปเบเบฑเบโเปเบเบงโเปเบ? เบเบปเบงเบขเปเบฒเบ, เปเบชเปเบเปเปเบเบตเปเบกเบตเบเบธเปเบกเปเบเบตเปเบกเบเบถเปเบเปเบเบเบปเปเบเปเบกเป: 1,2,3,4,5,6... เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบปเปเบเปเบกเปเบเบฐเบเปเบฒเบเบเบทเบเบฑเบเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบตเปเปเบเบทเปเบญเบกเปเบเบ. เปเบฅเบฐเปเบกเปเบเปเบฅเปเบง, เบเบปเปเบเปเบกเปเบเบฐเบชเบนเบเปเบชเบเปเบเบเบชเปเบฒเบเบเบปเปเบเปเบกเปเบเบญเบเบกเบฑเบ, เปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบญเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเปเปเบกเบนเบ. เบเบงเบฒเบกโเบเบฑเบโเบเปเบญเบโเบเบญเบโเบเบฒเบโเบเบญเบโเบซเบฒโ, เบเบฒเบโเปเบเบโ, เปเบฅเบฐโเบเบฒเบโเบฅเบปเบโเบเบฒเบโเบเปเบฒโเปเบเบตเบโเบเบฒเบโเบเบฐโเบเบฒเบโเปเบเบฑเบโเบญเบฑเบโเบเบฝเบงโเบเบฑเบโเบเบฑเบโเบเบฑเบโเบเบตโเบฅเบฒเบโเบเบฒเบโเบเบตเปโเปเบเบทเปเบญเบกโเบเปเปโ: O(nโ)โ. เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบ, เปเบเบเบงเบฒเบกเบเบดเบเปเบซเบฑเบเบเบญเบเบเปเบญเบ, เบเปเปเปเบชเบเบเบญเบเบเบปเปเบเปเบกเปเบเบนเป.
เบเบฝเบเปเบเปเบเบนเปเปเบเปเบฅเบปเบเบเบฐเบเบฝเบเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเบฎเปเบงเบกเปเบเบเบฒเบเบชเปเบฒเบซเบผเบงเบ.
เบเปเบญเบเบเปเปเปเบเปเบขเบนเปเปเบเบชเบนเบเบเบปเบเบเบฒเบเปเบฅเปเบง, เปเบฅเบฐเบเปเบญเบเบขเบฒเบเบฎเบนเปเบงเปเบฒเบเบปเบเบเบงเบฒเบกเบเปเบฝเบงเบเบฑเบเบซเบปเบงเบเปเปเปเบเบเบตเปเปเบเบปเปเบฒเบขเบฒเบเปเบเบดเปเบเปเบเบตเปเบกเปเบเบตเบก?
-
เปเบเบเบชเปเบฒเบเบเปเปเบกเบนเบ
-
เบชเบนเบเบเบฒเบเบเบดเบเปเบฅเป (DP, recursion, เบเบฒเบเบเบตเบเบญเบฑเบเบเปเปเบกเบนเบ, เปเบฅเบฐเบญเบทเปเบเป)
-
เบเบฒเบโเบเปเบฒโเปเบเปโเปเบเบโเบชเปเบฒเบโเบเปเปโเบกเบนเบโเปเบฅเบฐโเบงเบดโเบเบตโเบเบฒเบโเปเบโเบเบตโเบงเบดเบโเบเบตเปโเปเบเปโเบเบดเบโ
-
เบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบก Android Applications เปเบ Java
-
เบเบฒเบเบเบฝเบเปเบเบผเปเบเบผเบกเปเบงเบฑเบเปเบ Java
2 เบเบนเปเปเบเปเบฅเบปเบเบเบฐเปเบเบเบชเบฝเบ. 1 เบเบนเปเปเบเปเบเบปเบ.
เบเบตเปเบกเบฒ: www.habr.com