Hash tables are a quick way of looking up random data by making a "hash" of the key and then indexing the key into a direct-lookup table.
For example, if you hashed your keys (eg. names) in such a way that the hash was in the range 0 to 255 then you could then index straight into a 256-item table to find the resulting name, without having to scan the entire list.
Clearly a potential problem is collisions, where multiple names hash to the same thing. Typically a hash implementation reverts to a linear scan to handle this case.
Hashes can be very fast, however you usually have to choose between a smallish table (and thus have collisions) or a large table, which reduces collisions but then is likely to waste space by having empty entries.
Binary trees on the other hand sort keys into pairs, eg.
A M
A---K M---P
A--B K--L M--N P--R
Each pair indexes into a smaller chunk of the data. Transversing such a table is, I think, proportional to the log of the number of entries (each level is another power of 2).
For example, in this case to find N you need to go down 3 levels. (log (8) / log (2))
For each additional level you double the number of entries stored, for only one more level traversal. eg. 16 items would take 4 levels, 32 items would be 5 levels and so on.
Thus such a tree can be very quick to find something amongst a large number of entries. A side-effect is that by traversing the bottom level things are in sequence, which isn't true for hash tables, which are essentially random.
You can find implementations of trees in the STL (sets, multisets, maps, multimaps). I think some STL implementations also have hash sets and hash maps as an extension.