Programmer's Wiki
Advertisement

A binary search tree is a binary tree where in each node:

  • The left subtree contains only nodes with keys less than the node's key (the "data"/"value" of the node).
  • The right subtree contains only nodes with keys greater than the node's key.
  • Both subtrees are also binary search trees.

It follows that each key is distinct.

Binary search trees are especially useful in constructing other data structures such as sets, multisets and associative arrays.

Operations[]

Searching[]

Searching a binary search tree can easily be done using either an iterative or recursive method. Starting with the root node, we check to see if the current node contains the key we are searching for. If yes, then the key is found. If not, we do the search on the left subtree if the key is less, or the right subtree if the key is greater. We end the search when there is no existing child corresponding to the key (hence no subtree).

Recursive

This is a recursive algorithm for returning the value of a generic associative array implementation of a binary search tree, where valuetype is the type of the values. The type of the key is a comparable type where the operators <, > and = are defined.

search(key) as valuetype
    return search(root, key)

search(node, key) as valuetype
    if node is null then
        return null
    if key < node.key then
        return search(code.leftchild, key)
    else if key > node.key then
        return search(node.rightchild, key)
    else // equal
        return false.value
Iterative
search_iterative(key) as valuetype
    return search_iterative(root, key)

search_iterative(node, key) as valuetype
    currentnode = node
    while node is not null
         if key < node.key then
             node = node.leftchild
         else if key > node.key then
             node = node.rightchild
         else // equal
             return node.value
    return false // exited while loop, null child

Insertion[]

As with searching, we find a location where we would insert the new node. This is done recursively until we find a free node where we could insert the new node.

Recursive
insert(key, value)
    insert(root, key, value)

insert(ref node, key, value)
    if node is null
        node = new node with key = key, value = value
    else if key < node.key
        insert(node.leftchild, key, value)
    else if key > node.key
        insert(node.rightchild, key, value)
    else
        throw new exception with message = "key already exists in tree"
Recursive, without references
insert(node, key, value)
    if key < node.key
        if node.leftchild is null then
            node.leftchild = new node with key = key, value = value
        else
            insert(node.leftchild, key, value)
    else if key > node.key
        if node.rightchild is null then
            node.rightchild = new node with key = key, value = value
    else
        throw new exception with message = "key already exists in tree"

Traversal[]

We can use an inorder traversal to traverse through the nodes in the tree in order (of the keys).

Algorithm (recursive)
traverse() as list of node
    return traverse(root)

traverse(node) as list of node
    list = new list of node
    list.add(traverse(node.leftchild))
    list.add(node)
    list.add(traverse(node.rightchild))
    return list

Sorting[]

A binary search tree can be used to implement a simple sorting algorithm.

Algorithm
sort(list of t) as list of t
    tree = new binarysearchtree(t, t)
    for each item in list
        tree.insert(item, null)
    return keys in tree.traverse
Advertisement