0% found this document useful (0 votes)
2K views12 pages

MC0068 - Set 2

The document discusses different data structures and algorithms topics like binary trees, binary search trees, tree traversals, sorting algorithms and binary search. It provides examples and explanations of strictly binary tree, complete binary tree, insertion and searching in binary search trees, depth first traversal, insertion sort and binary search on an unsorted list.

Uploaded by

nikeneel
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2K views12 pages

MC0068 - Set 2

The document discusses different data structures and algorithms topics like binary trees, binary search trees, tree traversals, sorting algorithms and binary search. It provides examples and explanations of strictly binary tree, complete binary tree, insertion and searching in binary search trees, depth first traversal, insertion sort and binary search on an unsorted list.

Uploaded by

nikeneel
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 12

February 2010

Master of Computer Application (MCA) –


Semester 2
MC0068 – Data Structures using C
Assignment Set

1. Describe the theory of:


A) Strictly Binary Tree
B) Complete Binary Tree
Ans –

A) Strictly binary tree

If the outdegree of every node in a tree is either 0 or 2, then the tree


is said to be strictly binary tree i.e., each node can have maximum two
children or empty left and empty right child.

Example :

A binary tree is said to be strictly binary if every non-leaf node has


non-empty left and right subtrees. Fig shows a strictly binary tree.

A Strictly binary tree


B) Complete binary tree

A strictly binary tree in which the number of nodes at any level i is 2 i-1,
then the tree is said to be a complete binary tree. The tree shown in
figure below is a strictly binary tree and at the same time it is a complete
binary tree.

Example:

A Complete Binary tree

In a complete binary tree, the total number of nodes at level 0 is


1 i.e., 2°

Number of nodes at level 1 is 2 i.e., 21

Number of nodes at level 2 is 4 i.e., 22

Number of nodes at level 3 is 8 i.e., 23

……………………………………

……………………………………

……………………………………

Number of nodes at the last level d is 2d.

It is clear from the figure that all the nodes in the final level d are
leaf nodes and the total number of leaf nodes is 2d. In a complete binary
tree, we can easily find the number of non-leaf nodes. Now, let us find
the number of non-leaf nodes in a complete binary tree. Total number of
nodes in the complete binary tree =

2° + 21 + 22 + ………….2d.
Summation of this series is given by

S = a( rn- 1) 1( r- 1)

where a = 1, n = d+ 1 and r = 2

So, total number of nodes nt = 2d+1- 1

Nodes at level d are all leaf nodes. So, number of non-leaf nodes is given
by 2d+1 – 1 –2d which is equal to 2d – 1.

2. Describe with sample code snippets the following


operations on Binary Search Trees (BST):
A) Insertion
B) Searching
Ans –

A) Insertion

Creating a binary search tree is nothing but repeated insertion of an


item into the existing tree. So, we concentrate on how to insert an item
into the tree. In a BST (Binary Search Tree), items towards left subtree of
a node temp will be less than info(temp) and the items in the right
subtree are greater or equal to info(temp).

Consider the BST shown in above figure. Suppose the node pointed
to by temp (with item 140) has to be inserted. The item 140 is compared
with root node i.e., 100. Since it is greater, the right subtree of root node
has to be considered. Now compare 140 with 200 and since it is less,
consider the left subtree of the node 200. Now, compare 140 with 150.
Since it is less, consider the left subtree of node 150. Since, left subtree
of node 150 empty, the node containing the Item 140 has to be inserted
towards left of a node 150. Thus, to find the appropriate place and insert
an item, the search should start from the root node. This is achieved by
using two pointer variables prev and cur. The pointer variable prev
always points to parent of cur node. Initially cur points to root node and
prev points to NULL i.e.,

prev = NULL

cur = root

Now, as long as the item is less than info (cur), keep updating the
node pointed to by the pointer variable cur towards left. Otherwise,
update towards right. The pointer variable prev always points to the
parent node and cur points to the child node. Once cur points to NULL,
insert the node temp towards left (prev) if item is less than info (prev),
otherwise insert towards right. The code corresponding to this can be

prev = NULL;
cur = root;
/* find the position where to insert */
while ( cur != NULL )
{
prev = cur;
cur = ( item < cur->info ) ? cur->llink : cur->rlink;
}
if ( item < prev->info)
prev->llink = temp;
else
prev->rlink = temp;

The above steps can be executed provided the tree exists. If the tree
is empty initially, then make the node pointed to by temp itself as root
node. The complete C function to insert an item into a binary search tree
is shown in below example

B) Searching

Start searching from the root node and move downward towards left
or right based on whether the item lies towards left subtree or right
subtree. This is achieved by comparing this item with root node of an
appropriate subtree (left subtree or right subtree). If two items are same
then search is successful and address of that node is returned. If the
item is less than info (root), search in the left subtree, otherwise search
in the right subtree. If item is not found in the tree, finally root points to
NULL and return root indicating search is unsuccessful. The iterative
function to search for this item is shown in below example.

Example Function to search for an item in BST using iteration

NODE iterative_ search (int item, NODE root)


{
/* search for the item */
while ( root != NULL && item != root->info )
{
root = ( item < root->info ) ? root->llink : root->rlink;
}
eturn root;
}
The recursive function to search for an item is shown in below example.
Example : Function to search for an item in BST using recursion
NODE recursive_ search (int item, NODE root)
{
if ( root = = NULL ÷÷ item = = root->info ) return root;
if ( item < root->info ) return recursive_ search(item, root->llink);
return recursive_ search(item, root->rlink);
}

3. With the help of a program and a numerical example


explain the Depth First Traversal of a tree.
Ans –

3 Depth – First Traversal

In the depth-first traversal, we process all of a vertex’s


descendents before we move to an adjacent vertex. This concept is most
easily seen when the graph is a tree. In Figure below, we show the
preorder traversal, one of the standard depth-first traversals.

In a similar manner, the depth-first traversal of a graph starts by


processing the first vertex of the graph. After processing the first vertex,
we select any vertex adjacent to the first vertex and process it. As we
process each vertex, we select an adjacent vertex until we reach a
vertex with no adjacent entries. This is similar to reaching a leaf in a
tree. We then back out of the structure, processing adjacent vertices as
we go. It should be obvious that this logic requires a stack (or recursion)
to complete the traversal.

The order in which the adjacent vertices are processed depends on


how the graph is physically stored.

Depth first traversal of a tree

4. Write a program to perform a binary search on an


unsorted list of n integers.
Ans –
#include<iostream.h>
#include<conio.h>

void main()
{ clrscr();
int a[50],n,p,s,bsearch(int [],int,int);
void bubsort(int a[],int n)
cout<<"Enter the no. of elements: ";cin>>n;
cout<<"Enter the array...\n";
for (int i=0;i<n;i++) cin>>a[i];
cout<<"Enter the no. to be searched: ";cin>>s;
bubsort(a,n);
p=bsearch(a,n,s);
if (p==-1) cout<<"Sorry, element not found";
else cout<<s<<" was found at position "<<p+1;
getch();
}
void sort(int a[],int n)
{ int t;
for (int i=0;i<n;i++)
{ for (int j=0;j<(n-1)-i;j++)
{ if (a[j]>a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}

int bsearch(int a[],int n,int s)


{ int b=0,m,l=n-1;
while(b<l)
{ m=(b+l)/2;
if (s==a[m]) return(m);
else if(s>a[m]) b=m+1;
else l=m-1;
}
return(-1);
}

5. With the help of a numerical example, explain the


working of Insertion Sort.
Ans –

An insertion sort has the advantage that it is simple to understand


and simple to implement. Unfortunately, it is rather slow. Given an
unsorted array of integer values, an insertion sort visits each element of
the array, in turn. As it visits a particular element, it scans the array from
the beginning up to the determines where in that segment of the array
the current value belongs. It then inserts the current value in that
location and shifts every element of the array to the right, up to the
present location. It then goes on to the next location (value) in the array.
Notice that one index is going from 0 to n and for each such value and
another index is scanning the array from 0 to the value of the first index.
The result of this is – that this type of sort is O(n2).

This is a naturally occurring sorting method exemplified by a card player


arranging the cards dealt to him. He picks up the cards as they are dealt
and inserts them into the required position. Thus at every step, we insert
an item into its proper place in an already ordered list.

We will illustrate insertion sort with an example below given and


presenting the formal algorithm.

Example : Sort the following list using the insertion sort method:

Step 1 1 < 4, Therefore insert before 4

Step 2 3 > 1, 3 Insert between 1 & 4

Step 3 2 > I, 2, Insert between I & 3

Step 4 5 > I, 2,3,4, Insert after 4 (5)

Thus to find the correct position search the list till an item just greater
than the target is found. Shift all the items from this point one, down the
list. Insert the target in the vacated slot.
6. With your own example explain breadth first
traversal technique, and analyze its complexity.
Ans –

Breadth – First Traversal

In the breadth-first traversal of a graph, we process all adjacent


vertices of a vertex before going to the next level. Looking at the tree in,
Figure 7.7, we see that its breadth-first traversal starts at level 1 and
then processes all the vertices in level 2 before going on to process the
vertices in level 3.

Breadth-first traversal of a tree

The breadth-first traversal of a graph follows the same concept we


begin by picking a starting vertex; after processing it, we process all of
its adjacent vertices. After we process all of the first vertex adjacent
vertices, we pick the first adjacent vertex and process all of its vertices,
then the second adjacent vertex and process all of its vertices and so
forth until we are finished.

The breadth-first traversal uses a queue rather than a stack, As we


process each vertex, we place all of its adjacent vertices in the queue.
Then, to select the next vertex to be processed, we delete a vertex from
the queue and process it. Let’s trace this logic through the graph in
Figure below.
Breadth-first traversal of a graph

1. We begin by enqueuing vertex A in the queue.

2. We then loop, dequeuing the queue and processing the vertex from
the front of the queue. After processing the vertex, we place all of its
adjacent vertices into the queue. Thus, at Step 2 in Figure 7.8(b]), we
dequeue vertex X, process it, and then place vertices G and H in the
queue. We are then ready for Step 3, in which we process vertex G.

3. When the queue is empty, the traversal is complete.

7. Explain the theory regarding the following splay


trees:
A) Access Lemma
B) Static Optimality Theorem
Ans –

: A red-black tree with n internal nodes has height at most 2lg(n+1)

Proof: The tree rooted at any node x contains at least 2 bh(x) – 1 internal
nodes.

Base case: If the height of x is zero, then x must be a leaf and the tree
rooted at x contains at least 20 – 1 = 0 internal nodes.

Inductive hypothesis: Consider a node x that has a positive height and


is an internal node with two children. Each child has a black-height of
either bh(x) or bh(x) – 1 depending upon whether the child is red or
black, respectively. Since the height of a tree rooted at a child of x is less
than the height of the tree rooted at x itself, we can apply the inductive
hypothesis to conclude that each subtree rooted at a child has at least
2bh(x)-1 –1 internal nodes. Thus the tree rooted at x has at least (2 bh(x)-1 –1)
+ (2bh(x)-1 –1) + 1 = 2bh(x) – 1 internal nodes.

Let h be the height of the tree. According to properties 4 and 5 at


least half the node on any path from the root to a leaf, not including the
root, must be black. Consequently the black height of the root must be at
least h/2.

Thus n ³ 2h/2 – 1 and (n+1) ³ 2h/2


Take the lg of both sides of this inequality and find that

lg(n+1) ³ h/2 or h £ 2lg(n+1)

8. Explain the following in the context of files:


A) Sequential Files
B) Inverted Files

Ans –

A) Sequential files

A sequential file is the most primitive of all file structures. It has no


directory and no linking pointers. The records are generally organised in
lexicographic order on the value of some key. In other words, a particular
attribute is chosen whose value will determine the order of the records.
Sometimes when the attribute value is constant for a large number of
records a second key is chosen to give an order when the first key fails
to discriminate.

The implementation of this file structure requires the use of a sorting


routine.

Its main advantages are:

(1) it is easy to implement;

(2) it provides fast access to the next record using lexicographic order.

Its disadvantages:

(1) it is difficult to update – inserting a new record may require moving a


large proportion of the file;

(2) random access is extremely slow.

Sometimes a file is considered to be sequentially organised despite


the fact that it is not ordered according to any key. Perhaps the date of
acquisition is considered to be the key value, the newest entries are
added to the end of the file and therefore pose no difficulty to updating.
B) Inverted files

An inverted file is a file structure in which every list contains only one
record. Remember that a list is defined with respect to a keyword K, so
every K-list contains only one record. This implies that the directory will
be such that ni = hi for all i, that is, the number of records containing Ki
will equal the number of Ki-lists. So the directory will have an address for
each record containing Ki . For document retrieval this means that given
a keyword we can immediately locate the addresses of all the documents
containing that keyword. For the previous example let us assume that a
non-black entry in the field corresponding to an attribute indicates the
presence of a keyword and a black entry its absence. Then the directory
will point to the file in the way shown in Figure 6.3. The definition of an
inverted files does not require that the addresses in the directory are in
any order. However, to facilitate operations such as conjunction (’and’)
and disjunction (’or’) on any two inverted lists, the addresses are
normally kept in record number order. This means that ‘and’ and ‘or’
operations can be performed with one pass through both lists. The
penalty we pay is of course that the inverted file becomes slower to
update.

You might also like