Professional Documents
Culture Documents
Module4 Trees Graphs
Module4 Trees Graphs
A data structure is said to be nonlinear if its elements form a hierarchical classification where, data
items appear at various levels.
Tree is a non-linear data structure which organizes data in hierarchical structure and this is a
recursive definition.
There is a specially designated node called the root. The remaining nodes are partitioned into n>=0
disjoint sets T1, ..., Tn, where each of these sets is a tree. We call T1, ..., Tn are the subtrees of the
root.
A tree is hierarchical collection of nodes. One of the nodes, known as the root, is at the top of the
hierarchy. Each node can have at most one link coming into it. The node where the link originates is
called the parent node. The root node has no parent. The links leaving a node (any number of links
are allowed) point to child nodes. Trees are recursive structures. Each child node is itself the root of
a subtree. At the bottom of the tree are leaf nodes, which have no children.
Advantages of trees
Trees are so useful and frequently used, because they have some very serious advantages:
1
Introduction Terminology
In a Tree, Every individual element is called as Node. Node in a tree data structure, stores the actual
data of that particular element and link to next element in hierarchical structure. Example
1. Root
In a tree data structure, the first node is called as Root Node. Every tree must have a root node.
We can say that root node is the origin of tree data structure. In any tree, there must be only one
root node. We never have multiple root nodes in a tree. In above tree, A is a Root node
2. Edge
In a tree data structure, the connecting link between any two nodes is called as EDGE. In a tree with
'N' number of nodes there will be a maximum of 'N-1' number of edges.
3. Parent of a node
In a tree data structure, the node which is immediate predecessor of a node is called as PARENT
of that node. In simple words, the node which has link from it to a node is called as parent of that
node.
In the example,
A is the parent of B and C.
B is the parent of D, E and F. etc.
4. Child
In a tree data structure, the node which is descendant of any node is called as CHILD Node. In
simple words, the node which has a link from its parent node is called as child node. In a tree, any
parent node can have any number of child nodes. In a tree, all the nodes except root are child nodes.
e.g., Children of E are I and J.
5. Siblings
In a tree data structure, nodes which belong to same Parent are called as SIBLINGS. In simple
words, the nodes with same parent are called as Sibling nodes. Ex: D, E and F are Siblings.
2
6. Leaf
In a tree data structure, the node which does not have a child (or) node with degree zero is called
as LEAF Node. In simple words, a leaf is a node with no child. The leaf nodes are also called as
External Nodes or Terminal node. Ex: D, I, J, F, K, H
7. Internal Nodes
In a tree data structure, the node which has atleast one child is called as INTERNAL Node. In simple
words, an internal node is a node with atleast one child. That is, the nodes other than leaf nodes are
called as Internal Nodes. The root node is also said to be Internal Node if the tree has more than one
node. Internal nodes are also called as 'non-Terminal' nodes. Ex: A, B, C, E, G.
8. Degree
In a tree data structure, the total number of children of a node (or) number of subtrees of a node is
called as DEGREE of that Node. In simple words, the Degree of a node is total number of children it
has. The highest degree of a node among all the nodes in a tree is called as 'Degree of Tree'
9. Level
In a tree data structure, the root node is said to be at Level 0 and the children of root node are at
Level 1 and the children of the nodes which are at Level 1 will be at Level 2 and so on... In simple
words, in a tree each step from top to bottom is called as a Level and the Level count starts with '0'
and incremented by one at each level (Step). That is, all the children of a node at level i will be at
level i+1.
10. Height
In a tree data structure, the total number of edges from leaf node to a particular node in the longest
path is called as HEIGHT of that Node. In a tree, height of the root node is said to be height of the
tree. In a tree, height of all leaf nodes is '0'.
11. Depth
In a tree data structure, the total number of edges from root node to a particular node is called
as DEPTH of that Node. In a tree, the total number of edges from root node to a leaf node in the
longest path is said to be Depth of the tree. In simple words, the highest depth of any leaf node in a
3
tree is said to be depth of that tree. In a tree, depth of the root node is '0'.
12. Path
In a tree data structure, the sequence of Nodes and Edges from one node to another node is called
as PATH between that two Nodes. Length of a Path is total number of edges in that path. In below
example the path A - B - E - J has length 4.
In a tree data structure, each child from a node forms a subtree recursively. Every child node will
form a subtree on its parent node.
Binary Trees
In a normal tree, every node can have any number of children. Binary tree is a special type of tree
data structure in which every node can have a maximum of 2 children. One is known as left child
and the other is known as right child.
A tree in which every node can have a maximum of two children is called as Binary Tree.
In a binary tree, every node can have either 0 children or 1 child or 2 children but not more than 2
children. Example
4
There are different types of binary trees and they are:
1. Strictly Binary Tree
In a binary tree, every node can have a maximum of two children. But in strictly binary tree, every
node should have exactly two children or none. That means every internal node must have exactly
two children. A strictly Binary Tree can be defined as follows...
A binary tree in which every node has either two or zero number of children is called Strictly Binary
Tree. Strictly binary tree is also called as Proper Binary Tree or 2-Tree.
In a binary tree, every node can have a maximum of two children. But in strictly binary tree, every
node should have exactly two children or none.
Full Binary Tree is a Strictly Binary tree in which, all leaves are at the same level. That is, if the
highest-level number in the tree is k, then, up to level number k – 1, every node has exactly two
children and the number of nodes at every level is 2 ^ level number.
For example, at level 2 there must be 2^2 = 4 nodes and at level 3 there must be 2^3 = 8 nodes.
In other words, a binary tree in which every internal node has exactly two children and all leaf
nodes are at same level is called Complete Binary Tree.
A Binary Tree of height k is called complete Binary tree, if, upto level k – 1, it is full, and at level k, the
remaining nodes are packed to the left as much as possible.
5
Definition: A binary tree is a finite set of nodes that is either empty or consists of a root and two
disjoint binary trees called left subtree and right subtree.
objects: a finite set of nodes either empty or consisting of a root node, left Binary_Tree, and right
Binary_Tree.
Functions:
Boolean IsEmpty(bt)::= if (bt==empty binary tree) return TRUE else return FALSE
BinTree MakeBT(bt1, item, bt2)::= return a binary tree whose left subtree is bt1, whose right
subtree is bt2, and whose root node contains the data item
Bintree Lchild(bt)::= if (IsEmpty(bt)) return error else return the left subtree of bt
element Data(bt)::= if (IsEmpty(bt)) return error else return the data in the root node of bt
Bintree Rchild(bt)::= if (IsEmpty(bt)) return error else return the right subtree of bt
Samples of Trees
Complete Binary Tree
A A 1 A
B B 2 B C
CHAPTER 5 10
• The subtrees of a binary tree are ordered; those of a tree are not ordered.
6
Above two trees are different when viewed as binary trees. But same when viewed as trees.
Proof By Induction:
Induction Base: The root is the only node on level i=1.Hence ,the maximum number of nodes on
level i=1 is 2i-1=20=1.
Induction Hypothesis: Let I be an arbitrary positive integer greater than 1.Assume that maximum
number of nodes on level i-1 is 2i-2.
Induction Step: The maximum number of nodes on level i-1 is 2i-2 by the induction hypothesis. Since
each node in a binary tree has a maximum degree of 2,the maximum number of nodes on level i is
two times the maximum number of nodes on level i-1,or 2i-1.
k
2. Relation between number of leaf nodes and degree-2 nodes: For any nonempty binary tree, T, if
n0 is the number of leaf nodes and n2 the number of nodes of degree 2, then n0=n2+1.
PROOF: Let n and B denote the total number of nodes and branches in T. Let n0, n1, n2
represent the nodes with zero children, single child, and two children respectively.
3. A full binary tree of depth k is a binary tree of depth k having 2 -1 nodes, k>=0.
A binary tree with n nodes and depth k is complete iff its nodes correspond to the nodes numbered
from 1 to n in the full binary tree of depth k.
A binary tree data structure is represented using two methods. Those methods are 1)Array
Representation 2)Linked List Representation
7
1)Array Representation: In array representation of binary tree, we use a one dimensional array (1-D
Array) to represent a binary tree. To represent a binary tree of depth 'n' using array representation,
we need one dimensional array with a maximum size of
A complete binary tree with n nodes (depth = log n + 1) is represented sequentially, then for
any node with index i, 1<=i<=n, we have: a) parent(i) is at i/2 if i!=1. If i=1, i is at the root and
has no parent. b)left_child(i) ia at 2i if 2i<=n. If 2i>n, then i has no left child. c) right_child(i) is at
2i+1 if 2i +1 <=n. If 2i +1 >n, then i has no right child.
[1] A
Disadvantages:(1) waste of space
(2) insertion/deletion problem [2] B
[3] C
[4] D
[1] A
A [5] E
[2] B
[6] F
[3] --
B [7] G
[4] C
A [8] H
[5] --
[9] I
C [6] --
[7] --
B C
D [8] D
[9] --
. . D E F G
E
[16] E
H
CHAPTER 5
I 13
2. Linked Representation
We use linked list to represent a binary tree. In a linked list, every node consists of three fields. First
field, for storing left child address, second for storing actual data and third for storing right child
address. In this linked list representation, a node has the following structure...
int data;
8
Binary Tree Traversals
When we wanted to display a binary tree, we need to follow some order in which all the nodes of
that binary tree must be displayed. In any binary tree displaying order of nodes depends on the
traversal method. Displaying (or) visiting order of nodes in a binary tree is called as Binary Tree
Traversal.
CHAPTER 5 14
In In-Order traversal, the root node is visited between left child and right child. In this traversal, the
left child node is visited first, then the root node is visited and later we go for visiting right child
node. This in-order traversal is applicable for every root node of all subtrees in the tree. This is
performed recursively for all nodes in the tree.
In the above example of binary tree, first we try to visit left child of root node 'A', but A's left child is
a root node for left subtree. so we try to visit its (B's) left child 'D' and again D is a root for subtree
with nodes D, I and J. So we try to visit its left child 'I' and it is the left most child. So first we
9
visit 'I'then go for its root node 'D' and later we visit D's right child 'J'. With this we have completed
the left part of node B. Then visit 'B' and next B's right child 'F' is visited. With this we have
completed left part of node A. Then visit root node 'A'. With this we have completed left and root
parts of node A. Then we go for right part of the node A. In right of A again there is a subtree with
root C. So go for left child of C and again it is a subtree with root G. But G does not have left part so
we visit 'G' and then visit G's right child K. With this we have completed the left part of node C.
Then visit root node'C' and next visit C's right child 'H' which is the right most child in the tree so we
stop the process.
I-D-J-B-F-A-G-K-C–H
Algorithm
In the above example of binary tree, first we visit root node 'A' then visit its left child 'B' which is a
root for D and F. So we visit B's left child 'D' and again D is a root for I and J. So we visit D's left
child'I' which is the left most child. So next we go for visiting D's right child 'J'. With this we have
completed root, left and right parts of node D and root, left parts of node B. Next visit B's right
child'F'. With this we have completed root and left parts of node A. So we go for A's right
child 'C' which is a root node for G and H. After visiting C, we go for its left child 'G' which is a root
10
for node K. So next we visit left of G, but it does not have left child so we go for G's right child 'K'.
With this we have completed node C's root and left parts. Next visit C's right child 'H' which is the
right most child in the tree. So we stop the process.
That means here we have visited in the order of A-B-D-I-J-F-C-G-K-H using Pre-Order Traversal.
Algorithm
In Post-Order traversal, the root node is visited after left child and right child. In this traversal, left
child node is visited first, then its right child and then its root node. This is recursively performed
until the right most node is visited.
Here we have visited in the order of I - J - D - F - B - K - G - H - C - A using Post-Order Traversal.
Algorithm
11
Arithmetic Expression Using BT
+ inorder traversal
A / B * C * D + E
infix expression
* E preorder traversal
+ * * / A B C D E
* D prefix expression
postorder traversal
A B / C * D * E +
/ C
postfix expression
level order traversal
A B + * E * D / C A B
CHAPTER 5 15
CHAPTER 5 16
12
Level Order Traversal ( Using Queue) -- Traversal without Stack
void level_order(tree_pointer ptr) /* level order tree traversal */
{
int front = rear = 0;
tree_pointer queue[MAX_QUEUE_SIZE];
if (!ptr) return; /* empty queue */
addq(front, &rear, ptr);
for (;;) {
ptr = deleteq(&front, rear);
if (ptr) {
printf(“%d”, ptr->data);
if (ptr->left_child)
addq(front, &rear, ptr->left_child);
if (ptr->right_child)
addq(front, &rear, ptr->right_child);
}
else break;
} }
Level order Traversal is implemented with circular queue. In this order, we visit the root first, then root’s left child
followed by root’s right child. We continue in this manner, visiting the nodes at each new level from left most to right
most nodes.
We begin by adding root to the queue. The function operates by deleting the node at the front of the queue, printing
out the node’s data field, and adding the node’s left and right children to the queue. The level order traversal for above
arithmetic expression is + * E * D / C A B.
13
We're going to implement tree using node object and connecting them through references.
Definition: A binary search tree (BST) is a binary tree. It may be empty. If it is not empty,then all
nodes follows the below mentioned properties −
14
element k in left subtree otherwise search element k in right subtree. The function search recursively
searches the subtrees.
15
In a binary search tree, the insertion operation is performed with O(log n) time complexity. In binary
search tree, new node is always inserted as a leaf node. The insertion operation is performed as
follows...
Step 1: Create a newNode with given value and set its left and right to NULL.
Step 4: If the tree is Not Empty, then check whether value of newNode is smaller or larger than the
node (here it is root node).
Step 5: If newNode is smaller than or equal to the node, then move to its left child. If newNode
is larger than the node, then move to its right child.
Step 6: Repeat the above step until we reach a node (e.i., reach to NULL) where search terminates.
Step 7: After reaching a last node, then insert the newNode as left child if newNode is smaller or
equal to that node else insert it as right child.
Algorithm
Create newnode
If root is NULL
return
16
goto right subtree
else
endwhile
insert newnode
end If
Implementation
The implementation of insert function should look like this −
17
return; }
}
Deleting a node
Remove operation on binary search tree is more complicated, than insert and search. Basically, in
can be divided into two stages:
Now, let's see more detailed description of a remove algorithm. First stage is identical to algorithm
for lookup, except we should track the parent of the current node. Second part is more tricky. There
are three cases, which are described below.
1. Node to be removed has no children. --This case is quite simple. Algorithm sets corresponding
link of the parent to NULL and disposes the node.
18
2. Node to be removed has one child. In this case, node is cut from the tree and algorithm links
single child (with it's subtree) directly to the parent of the removed node.
3. Node to be removed has two children. --This is the most complex case. The deleted node can be
replaced by either largest key in its left subtree or the smallest in its right subtree. Preferably
which node has one child.
In a binary search tree, the deletion operation is performed with O(log n) time complexity. Deleting
a node from Binary search tree has following three cases...
19
Case 3: Deleting a node with two children
Step 2: Delete the node using free function (If it is a leaf) and terminate the function.
We use the following steps to delete a node with one child from BST...
Step 2: If it has only one child, then create a link between its parent and child nodes.
Step 3: Delete the node using free function and terminate the function.
We use the following steps to delete a node with two children from BST...
Step 2: If it has two children, then find the largest node in its left subtree (OR) the smallest node in
its right subtree.
Step 3: Swap both deleting node and node which found in above step.
Step 4: Then, check whether deleting node came to case 1 or case 2 else goto steps 2
Step 7: Repeat the same process until node is deleted from the tree.
20
if ((*parent)->left == *node)
(*parent)->left = NULL;
else
(*parent)->right = NULL;
free(*node);
} else {
/* delete root node with no children */
free(*node);
}
/* deleting node with one child */
} else if (!(*node)->right && (*node)->left) {
/* deleting node with left child alone */
tmpNode = *node;
(*parent)->right = (*node)->left;
free(tmpNode);
*node = (*parent)->right;
} else if ((*node)->right && !(*node)->left) {
/* deleting node with right child alone */
tmpNode = *node;
(*parent)->left = (*node)->right;
free(tmpNode);
(*node) = (*parent)->left;
} else if (!(*node)->right->left) {
/*
* deleting a node whose right child
* is the smallest node in the right
* subtree for the node to be deleted.
*/
tmpNode = *node;
(*node)->right->left = (*node)->left;
(*parent)->left = (*node)->right;
free(tmpNode);
*node = (*parent)->left;
} else {
/*
* Deleting a node with two children.
* First, find the smallest node in
* the right subtree. Replace the
* smallest node with the node to be
* deleted. Then, do proper connections
* for the children of replaced node.
*/
tmpNode = (*node)->right;
while (tmpNode->left) {
21
tmpParent = tmpNode;
tmpNode = tmpNode->left;
}
tmpParent->left = tmpNode->right;
tmpNode->left = (*node)->left;
tmpNode->right =(*node)->right;
free(*node);
*node = tmpNode;
}
} else if (data < (*node)->data) {
/* traverse towards left subtree */
deletion(&(*node)->left, node, data);
} else if (data > (*node)->data) {
/* traversing towards right subtree */
deletion(&(*node)->right, node, data);
}
}
Height of a Binary Search Tree:
Height of a Binary Tree For a tree with just one node, the root node, the height is defined to be 0, if
there are 2 levels of nodes the height is 1 and so on. A null tree (no nodes except the null node) is
defined to have a height of –1.
22
Example
10,12,5,4,20,8,7,15 and 13
23
24