Professional Documents
Culture Documents
1
Trees
You have seen that using linked lists you can
represent an ordered collection of values without
using arrays. Although linked lists require more
memory space than arrays ( as they have to store
address at each node), they have definite advantages
over arrays. Insertion and deletion of items can be
carried out with out involving considerable
movement of data.
2
files. The subdirectories would have further set of
subdirectories.
• The top node in the tree is called the root and all
other nodes branch off from this one.
3
• Every node in the tree can have some number of
children. Each child node can in turn be the parent
node to its children and so on.
Binary Trees
4
Definition: A binary tree is a tree in which each
node can have maximum two children. Thus each
node can have no child, one child or two children.
The pointers help us to identify whether it is a left
child or a right child.
5
through each link to locate a particular number. So a
linear linked structure is not helping us at all.
59
18 67
13 32 63 72
25
6
With this arrangement any search is taking at most 4
steps.
For larger set of numbers, if we can come up with a
good tree arrangement than the search time can be
reduced dramatically.
7
• The following are NOT binary trees:
8
Definitions:
root
Level 0
Level 1
Level 2
Level 3
9
Full Binary Tree 45
24 76
14 32 61 87
8 20 56 67
27 81
37 94
How many nodes?
n = 2h – 1 ( maximum)
h = log ( n+1)
10
Implementation
• A binary tree has a natural implementation in linked
storage. A tree is referenced with a pointer to its root.
11
Note the recursive definition of trees. A tree is a node with
structure that contains more trees. We have actually a tree
located at each node of a tree.
• Preorder
• Inorder
• Postorder
12
n1
n2 n3
In – order : n2 n1 n3
Pre-order : n1 n2 n3
Post order : n2 n3 n1
13
A tree will typically have more than 3 nodes. Instead of
nodes n2 and n3 there would be subtrees as shown below:
root
Left Right
subtree subtree
14
− With postorder traversal the root is visited after both the
subtrees have been visited.(left subtree followed by right
subtree.
The function may seem very simplistic, but the real power
lies in the recursive formulation. In fact there is a double
recursion. The real job is done by the system on the run-
time stack. This simplifies coding while it puts a heavy
burden on the system.
void preorder(struct tree_node * p)
{ if (p !=NULL) {
printf(“%d\n”, p->data);
15
preorder(p->left_child);
preorder(p->right_child);
}
}
Take a tree of say height 3 with maybe 6 nodes and try to
run the above recursion to find out the actual order of
printing the nodes.
Example: root
a
b c
d e
f g
a(root)
b(left)
c d f g e (right)
16
In the inorder traversal, we first visit its left subtree (all the
nodes) , then we visit the root node and then its right
subtree.
b c
d e
f g
Inorder: bafdgce
b(left)
a(root)
f d g c e(right)
17
In a postorder traversal, we first visit its left subtree (all the
nodes) and then visit its right subtree ( all the nodes) and
then finally we visit the root node.
Example: root
a
b c
d e
f g
Postorder: bfgdeca
b(left)
18
f g d e c(right)
a(root)
19
Finding Maximum value in a given tree p
int findMax (struct tree_node *p)
{
int node_data, leftmax, rightmax, max;
max = -1
//assume all values in the tree are positive
integers
if (p != NULL)
{ node_data = p -> data;
leftmax = findMax(p -> left_child);
rightmax = findMax(p->right_child);
20
45
24
76
node_value = 45
leftmax = 24 (max of 24, -1, -1 )
rightmax = 76 (max of 76, -1, -1 )
21
45
24 76
14 32
22
Finding sum of values of all the nodes of a tree
To find the sum, add to the value of the current node, the
sum of values of all nodes of left subtree and the sum of
values of all nodes in right subtree.
23
24