0% found this document useful (0 votes)
29 views

Lecture 12

This document discusses data structures and binary trees. It provides examples of inserting nodes into a binary tree and traversing a binary tree using preorder, inorder, and postorder traversal. It explains that searching for a node in a balanced binary tree takes O(log n) time due to the tree's height being O(log n). Recursive functions use the call stack to call themselves, with each recursive call adding a new stack frame.

Uploaded by

Vilgaxx
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
29 views

Lecture 12

This document discusses data structures and binary trees. It provides examples of inserting nodes into a binary tree and traversing a binary tree using preorder, inorder, and postorder traversal. It explains that searching for a node in a balanced binary tree takes O(log n) time due to the tree's height being O(log n). Recursive functions use the call stack to call themselves, with each recursive call adding a new stack frame.

Uploaded by

Vilgaxx
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 20

Lecture No.

12

Data Structures
Trace of insert

14

4 15

3 9 18

7 p 16 20

5 node 17

17, 9, 14, 5 p->setRight( node );


Cost of Search
 Given that a binary tree is level d
deep. How long does it take to
find out whether a number is
already present?
 Consider the insert(17) in the
example tree.
 Each time around the while loop,
we did one comparison.
 After the comparison, we moved a
level down.
Cost of Search
 With the binary tree in place, we can
write a routine find(x) that returns
true if the number x is present in the
tree, false otherwise.
 How many comparison are needed
to find out if x is present in the tree?
 We do one comparison at each level
of the tree until either x is found or q
becomes NULL.
Cost of Search
 If the binary tree is built out of n
numbers, how many comparisons are
needed to find out if a number x is in
the tree?
 Recall that the depth of the complete
binary tree built using ‘n’ nodes will
be log2(n+1) – 1.
 For example, for n=100,000,
log2(100001) is less than 20; the tree
would be 20 levels deep.
Cost of Search
 If the tree is complete binary or
nearly complete, searching through
100,000 numbers will require a
maximum of 20 comparisons.
 Or in general, approximately log2(n).
 Compare this with a linked list of
100,000 numbers. The comparisons
required could be a maximum of n.
Binary Search Tree
 A binary tree with the property that
items in the left subtree are smaller
than the root and items are larger or
equal in the right subtree is called a
binary search tree (BST).
 The tree we built for searching for
duplicate numbers was a binary
search tree.
 BST and its variations play an
important role in searching
algorithms.
Traversing a Binary Tree
 Suppose we have a binary tree,
ordered (BST) or unordered.
 We want to print all the values
stored in the nodes of the tree.
 In what order should we print
them?
Traversing a Binary Tree
 Ways to print a 3 node tree:

14

4 15

(4, 14, 15), (4,15,14)


(14,4,15), (14,15,4)
(15,4,14), (15,14,4)
Traversing a Binary Tree
 In case of the general binary tree:
N node

L left right R
subtre subtre
e e
(L,N,R), (L,R,N)
(N,L,R), (N,R,L)
(R,L,N), (R,N,L)
Traversing a Binary Tree
 Three common ways
N node

left right
L subtre subtre R
e e
Preorder: (N,L,R)
Inorder: (L,N,R)
Postorder: (L,R,N)
Traversing a Binary Tree
void preorder(TreeNode<int>* treeNode)
{
if( treeNode != NULL )
{
cout << *(treeNode->getInfo())<<"
";
preorder(treeNode->getLeft());
preorder(treeNode->getRight());
}
}
Traversing a Binary Tree
void inorder(TreeNode<int>* treeNode)
{
if( treeNode != NULL )
{
inorder(treeNode->getLeft());
cout << *(treeNode->getInfo())<<"
";
inorder(treeNode->getRight());
}
}
Traversing a Binary Tree
void postorder(TreeNode<int>* treeNode)
{
if( treeNode != NULL )
{
postorder(treeNode->getLeft());
postorder(treeNode->getRight());
cout << *(treeNode->getInfo())<<"
";
}
}
Traversing a Binary Tree
cout << “preorder: "; preorder( root);
cout << "inorder: "; inorder( root );
cout << "postorder: "; postorder( root );
Traversing a Binary Tree
14

4 15

3 9 18

7 16 20

5 17

Preorder: 14 4 3 9 7 5 15 18 16 17 20
Traversing a Binary Tree
14

4 15

3 9 18

7 16 20

5 17

Inorder: 3 4 5 7 9 14 15 16 17 18 20
Traversing a Binary Tree
14

4 15

3 9 18

7 16 20

5 17

Postorder: 3 5 7 9 4 17 16 20 18 15 14
Recursive Call
 Recall that a stack is used during
function calls.
 The caller function places the
arguments on the stack and
passes control to the called
function.
 Local variables are allocated
storage on the call stack.
 Calling a function itself makes no
difference as far as the call stack
is concerned.
Stack Layout during a call
 Here is stack layout when function F
calls function F (recursively):

Parameters(F) Parameters(F) Parameters(F)


Local variables(F) Local variables(F) Local variables(F)

Return address(F) Return address(F) Return address(F)


sp
Parameters(F) Parameters(F)
sp
Local variables(F)

Return address(F)
sp
At point of call During execution of F After call

You might also like