Printing Trees using C programming
Write a recursive function outputTree to display a binary tree on the
screen. The function should output the tree row-by-row with the top of the tree at the left of the
screen and the bottom of the tree toward the right of the screen. Each row is output vertically. For
example, the binary tree output as follows:

Note the rightmost leaf node appears at the top of the output in the rightmost column, and the
root node appears at the left of the output. Each column of output starts five spaces to the right of
the previous column. Function outputTree should receive as arguments a pointer to the root node
of the tree and an integer totalSpaces representing the number of spaces preceding the value to be
output (this variable should start at zero so the root node is output at the left of the screen). The
function uses a modified inorder traversal to output the tree—it starts at the rightmost node in the
tree and works back to the left. The algorithm is as follows:
While the pointer to the current node is not null
Recursively call outputTree with the current node’s right subtree and totalSpaces + 5
Use a for statement to count from 1 to totalSpaces and output spaces
Output the value in the current node
Set the pointer to the current node to point to the left subtree of the current node
Increment totalSpaces by 5.
Answer:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// TreeNode structure definition
struct TreeNode {
struct TreeNode *leftPtr; // pointer to left subtree
int data; // node data
struct TreeNode *rightPtr; // pointer to right subtree
}; // end struct TreeNode
typedef struct TreeNode TreeNode;
typedef TreeNode *TreeNodePtr;
// function prototypes
void insertNode( TreeNodePtr *treePtr, int value );
void outputTree( TreeNodePtr treePtr, int spaces );
int main( void )
{
int i; // loop counter
int item; // random value to be inserted
int totalSpaces = 0; // spaces preceding output
TreeNodePtr rootPtr = NULL; // points to the tree root
srand( time( NULL ) ); // randomize
puts( "The numbers being placed in the tree are:" );
// insert random values between 1 and 10 in the tree
for ( i = 1; i <= 10; ++i ) { item = rand() % 15;
printf( "%3d", item );
insertNode( &rootPtr, item ); } // end for
puts( "\n" );
outputTree( rootPtr, totalSpaces ); // display tree
} // end main
// insert a node into the tree
void insertNode( TreeNodePtr *treePtr, int value ) {
// if treePtr is NULL
if ( *treePtr == NULL ) {
// dynamically allocate memory
*treePtr = malloc( sizeof( TreeNode ) );
// if memory was allocated, insert node
if ( *treePtr != NULL ) { ( *treePtr )->data = value;
( *treePtr )->leftPtr = NULL;
( *treePtr )->rightPtr = NULL;
} // end if
else {
printf( "%d not inserted. No memory available.\n", value );
} // end else
} // end if
else { // recursively call insertNode
// insert node in left subtree
if ( value < ( *treePtr )->data ) {
insertNode( &( ( *treePtr )->leftPtr ), value );
} // end if
else {
// insert node in right subtree
if ( value > ( *treePtr )->data ) {
insertNode( &( ( *treePtr )->rightPtr ), value );
} // end if
else { // duplicate value
printf( "%s", "dup" );
} // end else
} // end else
} // end else
} // end function insertNode
// display the tree
void outputTree( TreeNodePtr treePtr, int spaces )
{
int loop; // loop counter
// while not the end of tree
while ( treePtr != NULL ) {
// recursive call with right subtree
outputTree( treePtr->rightPtr, spaces + 5 );
// loop and output spaces
for ( loop = 1; loop <= spaces; ++loop ) { printf( "%s", " " ); } // end for
printf( "%d\n", treePtr->data );
// set pointer to left subtree and make recursive call
outputTree( treePtr->leftPtr, spaces + 5 );
treePtr = NULL;
} // end while
} // end function outputTree
Leave a reply