In the first section, we alluded to the varying uses of trees, especially in the context of sorting and searching. The task of sorting consists of taking data and arranging it in some sort of predetermined order. Searching consists of trying to find a particular piece of data from the total set of data. As one might expect, searching is easier once the data have been sorted. For example, if one had a list of numbers, searching would mean checking whether or not a specific number is in the list and if it is finding exactly where in the list it is. For a more comprehensive discussion of sorting and searching, with particular emphasis on the complexity of the different sorts and searches, see the sorting and searching SparkNotes. Here we will be covering binary search trees more from a practical, rather than a theoretical, perspective.
A binary search tree is one where all of the data in the nodes in the left subtree come before the data in the current node with regard to some ordering scheme, and all the nodes in the right subtree come after. This condition must be true for all of the nodes in the tree. For example:
The above is a binary search tree for integers, while the following is not:
In a binary search tree, the smallest element will always be the one found by following the subtrees to the left until you reach a leaf. Similarly, the largest is found by traveling to the right until a leaf is reached.
In this topic, we will cover both how to build a binary search tree from a data set as well as how to use it in searching.
Related to this topic is the heap, a tree in which the root node is greater than all of its descendants and in which the subtrees are also heaps.