  In 1971, Knuth gave an $O(n^2)$-time algorithm for the classic problem of
finding an optimal binary search tree. Knuth's algorithm works only for search
trees based on 3-way comparisons, while most modern computers support only
2-way comparisons (e.g., $<, \le, =, \ge$, and $>$). Until this paper, the
problem of finding an optimal search tree using 2-way comparisons remained open
-- poly-time algorithms were known only for restricted variants. We solve the
general case, giving (i) an $O(n^4)$-time algorithm and (ii) an $O(n \log
n)$-time additive-3 approximation algorithm. Also, for finding optimal binary
split trees, we (iii) obtain a linear speedup and (iv) prove some previous work
incorrect.
