아래의 자료구조는 BinarySearchTree이다.

특징은 아래와 같다.

  • 재귀적으로 구현되었다.
    • 중위순회한다.
    • 재귀적으로 insert한다.

아래의 구조는 좋은 점이 한가지 정도 있다.

그나마 외우기 편하다는 점이다.

단점은 스택이 터질 것이라는 점이며 최적화가 필요하다는 점이다.

/**
 * example
 * new Node(3) // Node {data: 3, left: null, right: null}
 */
class Node {
  constructor(data = null, left = null, right = null) {
    this.data = data;
    this.left = left;
    this.right = right;
  }
}

class BinarySearchTree {
  constructor(keys = []) {
    this.root = null;
    for (const key of keys) {
      this.root = this.insert(this.root, key);
    }
  }

  insert(targetNode, key) {
    if (!targetNode) return new Node(key);

    if (targetNode.data > key) {
      targetNode.left = this.insert(targetNode.left, key); // key
    } else {
      targetNode.right = this.insert(targetNode.right, key);
    }
    return targetNode;
  }

  inorder(node = null) {
    if (!node) return [];

    const result = [];
    result.push(...this.inorder(node.left));
    result.push(node.data);
    result.push(...this.inorder(node.right));
    return result;
  }
}

const main = () => {
  const keys = [3, 2, 1];
  const bst = new BinarySearchTree(keys);
  console.log(bst.inorder(bst.root));
};

main();