Trees

1. General

A tree is a set of nodes which are connected by branches to other nodes in a 'tree-like' structure. There is a special node called the root from which all other nodes can be accessed. Other nodes are grouped into subtrees which in turn form other subtrees and so on. The tree shown in figure 1 has a variable number of branches from each node and may not be a practical structure to implement. A special tree with more than two branches can be implemented as a B Tree. A tree with a maximum of two branches is known as a Binary Tree. A Strict Binary Tree has either none or two branches.


 

2. Knuth Binary Trees


A Knuth Binary Tree has none, one or two branches. Figure 2 shows a Knuth Binary Tree. Each node contains two pointers, one pointing to the left subtree and one pointing to the right subtree. A Knuth Tree is easier to implement than a strict binary tree as recursive algorithms can be used. In a Binary Search Tree the values contained in the nodes in the left subtree, child nodes, will all be less than that in the root node. Similarly the values contained in the nodes in the right subtree will all be greater than that in the root node. Trees can be reversed if required by making the left subtrees contain larger values than the root.

Figure 3 shows the order of the nodes in a example of a binary search tree. The letters symbolise the order of the nodes. In a balanced tree the root node would be approximately midway in an ordered list of the contents of the nodes. Nodes with lower values than the root are found in the left subtree and higher values in the right subtree. Each subtree follows the same rule.


 

3. Traversing a Tree

A traverse is an ordered walk through a tree such that each node is visited only once. There are various ways of traversing a tree. Using figure 3 as an example:
 
method description direction visit order
Top down  start at the root and visit nodes at each level  from left DCFAEHBGI
Bottom up start furthest from the root and visit nodes at each level from left BGIAEHCFD
Preorder (prefix)  visit the root,  traverse each subtree (from left) recursive DCABFEHGI
Postorder (postfix) traverse each subtree (from left) visit the root recursive BACDEGIHF
Linear Search traverse left subtree visit root traverse right subtree  recursive ABCDEFGHI

 
 
 

4. Algorithm for constructing a tree (adding a unique node)

If the tree is empty then
  make this item the tree
else
  compare the item to the root
  if the item comes before the root
    add item to the left branch
  end if
  if the item comes after the root 
      (if item is not unique need to use an else to allow for equality)
    add item to the right branch
  end if
end if

5. Algorithm for searching a tree

if the tree is not empty and not found
  if the key sought equals the root's key then
    found is true
  else
    if the key sought is less than the root's key then
      search down the left tree
    else
      search down the right tree
    end if
  end if
end if

6. Deleting an item from a tree


There are 4 cases:
 

6.1 The node is a leaf

Free the space occupied by the leaf node.
Make the pointer to the node from the parent node == NULL.

6.2 The node has only 1 branch

Graft the child branch of the node onto the parent node.
Free the space occupied by the deleted node.

6.3 The node has 2 branches and the Rightmost Node of the Left Subtree (RNLS) is a leaf

Copy data part of the RNLS to data part of node to be deleted
Free the space occupied by the RNLS 
Make pointer to the RNLS from it's parent == NULL

6.4 The node has 2 branches and the RNLS has a left subtree

Copy data part of RNLS to data part of node to be deleted
Graft the child branch of the RNLS (can only be a left branch) 
  onto the RNLS's parent node.
Free the space occupied by the RNLS

7. Program Source Code

The code imaged below is downloadable from here .

Global declarations

global

main function

main

chop, pause and menu functions

chop, pause and menu

display and getentry functions

display and genentry

insert and find_del functions

delet function

delet

whichcase function

whichcase