Level Order Tree Traversal
METHOD 1 (Use function to print a given level)
Algorithm:
/*Function to print level order traversal of tree*/ printLevelorder(tree) for d = 1 to height(tree) printGivenLevel(tree, d); /*Function to print all nodes at a given level*/ printGivenLevel(tree, level) if tree is NULL then return; if level is 1, then print(tree->data); else if level greater than 1, then printGivenLevel(tree->left, level-1); printGivenLevel(tree->right, level-1);
Time complexity : O(n^2)
c/c++ code:-
c/c++ code:-
struct
node
{
int
data;
struct
node* left, *right;
};
/* Function protoypes */
void
printGivenLevel(
struct
node* root,
int
level);
int
height(
struct
node* node);
struct
node* newNode(
int
data);
/* Function to print level order traversal a tree*/
void
printLevelOrder(
struct
node* root)
{
int
h = height(root);
int
i;
for
(i=1; i<=h; i++)
printGivenLevel(root, i);
}
/* Print nodes at a given level */
void
printGivenLevel(
struct
node* root,
int
level)
{
if
(root == NULL)
return
;
if
(level == 1)
printf
(
"%d "
, root->data);
else
if
(level > 1)
{
printGivenLevel(root->left, level-1);
printGivenLevel(root->right, level-1);
}
}
/* Compute the "height" of a tree -- the number of
nodes along the longest path from the root node
down to the farthest leaf node.*/
int
height(
struct
node* node)
{
if
(node==NULL)
return
0;
else
{
/* compute the height of each subtree */
int
lheight = height(node->left);
int
rheight = height(node->right);
/* use the larger one */
if
(lheight > rheight)
return
(lheight+1);
else
return
(rheight+1);
}
}
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct
node* newNode(
int
data)
{
struct
node* node = (
struct
node*)
malloc
(
sizeof
(
struct
node));
node->data = data;
node->left = NULL;
node->right = NULL;
return
(node);
}
/* Driver program to test above functions*/
int
main()
{
struct
node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf
(
"Level Order traversal of binary tree is \n"
);
printLevelOrder(root);
return
0;
}
METHOD 2 (Use Queue)
Algorithm:
printLevelorder(tree)
1) Create an empty queue q
2) temp_node = root /*start from root*/
3) Loop while temp_node is not NULL
a) print temp_node->data.
b) Enqueue temp_node’s children (first left then right children) to q
c) Dequeue a node from q and assign it’s value to temp_node
Time complexity : O(n)
C/C++ code:-
struct
node
{
int
data;
struct
node* left;
struct
node* right;
};
/* frunction prototypes */
struct
node** createQueue(
int
*,
int
*);
void
enQueue(
struct
node **,
int
*,
struct
node *);
struct
node *deQueue(
struct
node **,
int
*);
/* Given a binary tree, print its nodes in level order
using array for implementing queue */
void
printLevelOrder(
struct
node* root)
{
int
rear, front;
struct
node **queue = createQueue(&front, &rear);
struct
node *temp_node = root;
while
(temp_node)
{
printf
(
"%d "
, temp_node->data);
/*Enqueue left child */
if
(temp_node->left)
enQueue(queue, &rear, temp_node->left);
/*Enqueue right child */
if
(temp_node->right)
enQueue(queue, &rear, temp_node->right);
/*Dequeue node and make it temp_node*/
temp_node = deQueue(queue, &front);
}
}
/*UTILITY FUNCTIONS*/
struct
node** createQueue(
int
*front,
int
*rear)
{
struct
node **queue =
(
struct
node **)
malloc
(
sizeof
(
struct
node*)*MAX_Q_SIZE);
*front = *rear = 0;
return
queue;
}
void
enQueue(
struct
node **queue,
int
*rear,
struct
node *new_node)
{
queue[*rear] = new_node;
(*rear)++;
}
struct
node *deQueue(
struct
node **queue,
int
*front)
{
(*front)++;
return
queue[*front - 1];
}
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct
node* newNode(
int
data)
{
struct
node* node = (
struct
node*)
malloc
(
sizeof
(
struct
node));
node->data = data;
node->left = NULL;
node->right = NULL;
return
(node);
}
/* Driver program to test above functions*/
int
main()
{
struct
node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf
(
"Level Order traversal of binary tree is \n"
);
printLevelOrder(root);
return
0;
}
No comments:
Post a Comment