You are on page 1of 6

/* Functionality: 1)Tree Creation: * User will be asked to enter number of nodes

and values of each node. * User has to enter data using keyboard. * N-ary tree will
be created based on data given by user. 2)Conditions considering while tree
creation: * All child values will be less than parent value. * All sibling values
will be greater than previous siblings. * As Root node is parent of all nodes it
will have maximum value. 3)N-ary tree structure: * each node will have info
regarding first child and next sibling. * Root can't have siblings. * user can
enter as many nodes as he want. * Any node can have any number of childs or
siblings( Root can have only childs) 4)Output: * User can see created tree
information imediately or can save it in fil e. * user can get tree stucture in 3
formats: Inorder,Preorder,Postorder. * User can give ouput file name while saving
output in file. */

#include<stdlib.h> #include<stdio.h> #include<string.h> struct tree_el { // n-ary


tree node definition int val; struct tree_el * sibling, * child; }; typedef struct
tree_el node; void insert(node ** tree, node * item) { // Function to insert new
node if(!(*tree)) { *tree = item; // Root Node insertion return; } if(item-
>val<(*tree)->val) // child node inserion insert(&(*tree)->child, item); else
if(item->val>(*tree)->val) // sibling node insertion insert(&(*tree)->sibling,
item); } void print_node_info(node * tree) { // Function to print node information:
Node value,Node first child,Node next sibling if(tree->child && tree->sibling)
{ printf("%d, parent of %d and sibling of %d\n",tree->val, (tree->child) ->val,
(tree->sibling)->val);
} else if (tree->child) { printf("%d, parent of %d\n",tree->val, (tree->child)-
>val); } else if (tree->sibling) { printf("%d, sibling of %d\n",tree->val,(tree-
>sibling)->val); } else printf("%d\n",tree->val); } void in_order_print(node *
tree) { // Function to print Node information in Inor der if(tree->child)
in_order_print(tree->child); print_node_info(tree); if(tree->sibling)
in_order_print(tree->sibling); } void pre_order_print(node * tree) { // Function to
print Node information in pre order print_node_info(tree); if(tree->child)
pre_order_print(tree->child); if(tree->sibling) pre_order_print(tree->sibling); }
void post_order_print(node * tree) { // Function to print Node information in po
storder if(tree->child) post_order_print(tree->child); if(tree->sibling)
post_order_print(tree->sibling); print_node_info(tree); } void save_node_info(node
* tree,char * file_name) {// Function to save node info rmation in file: Node
value,Node first child,Node next sibling FILE *ptr_file; ptr_file =
fopen(file_name, "a"); if(tree->child && tree->sibling) { fprintf(ptr_file,"%d,
parent of %d and sibling of %d\n",tree->val, (tr ee->child)->val,(tree->sibling)-
>val); } else if (tree->child) { fprintf(ptr_file,"%d, parent of %d\n",tree->val,
(tree->child)->val); } else if (tree->sibling) { fprintf(ptr_file,"%d, sibling of
%d\n",tree->val,(tree->sibling)->val) ; } else fprintf(ptr_file,"%d\n",tree->val);
fclose(ptr_file); }
void in_order_save(node * tree,char * file_name) { // Function to save Node info
rmation in file in Intorder if(tree->child) in_order_save(tree->child,file_name);
save_node_info(tree,file_name); if(tree->sibling) in_order_save(tree-
>sibling,file_name); } void pre_order_save(node * tree,char * file_name) { //
Function to print Node in formation in file in preorder
save_node_info(tree,file_name); if(tree->child) pre_order_save(tree-
>child,file_name); if(tree->sibling) pre_order_save(tree->sibling,file_name); }
void post_order_save(node * tree,char * file_name) { // Function to print Node i
nformation in file in postorder if(tree->child) post_order_save(tree-
>child,file_name); if(tree->sibling) post_order_save(tree->sibling,file_name);
save_node_info(tree,file_name); } void delete_tree(node * tree) // Function to
delete tree { if (tree) { delete_tree(tree->child); delete_tree(tree->sibling);
free(tree); } } void main() { // Main Function node * curr, * root; int
i,num_of_nodes,*node_values,temp,choice,exit=1,print_choice,order_choice; char
file_name[100]; FILE *ptr_file; root = NULL; while (exit) // While loop to control
program termination { strcpy(file_name,""); print_choice= order_choice= choice =
num_of_nodes = temp = 0; node_values= NULL; printf("\n\nPlease select
option:\n"); // Options to proceed further in the prog ram. printf("1.Create new
tree\n"); printf("2.Print existing tree\n"); printf("3.Exit\n");
scanf("%d",&choice); switch(choice) { case 1: // Creating a new tree if(root)
delete_tree(root); // Deleting existing tree before new tree creation.
root = NULL; printf("\nPlease give number of nodes to be entered:\n");
scanf("%d",&num_of_nodes); node_values = calloc(num_of_nodes,sizeof(int));
for(i=1;i<=num_of_nodes;i++) // For loop to enter required nu mber of nodes (Node
values should be unique),duplicate //data will be ignored. { printf("\nenter value
for a node:\n"); scanf("%d",&node_values[i-1]); if(node_values[0] < node_values[i-
1]) // Getting maximum value to create root node { temp = node_values[i-1];
node_values[i-1] = node_values[0]; node_values[0] = temp; } }
for(i=1;i<=num_of_nodes;i++) // Creating n-ary tree based on data entered by user {
curr = (node *)malloc(sizeof(node)); curr->child = curr->sibling = NULL; curr->val
= node_values[i-1]; insert(&root, curr); } break; case 2: // Printing tree
information if(root) // Checking whether tree exist or not. { printf("\nPlease
select print Location:\n"); // Options to get output printf("1.Print Here\n");
printf("2.Print in a file\n"); printf("3.Do 1 and 2.\n");
scanf("%d",&print_choice); printf("\nPlease select Print order:\n"); // Options to
select Order of nodes in output printf("1.In-order\n"); printf("2.pre-order\n");
printf("3.post-order\n"); scanf("%d",&order_choice); if(print_choice == 2 ||
print_choice == 3) // Checking whether " file name" is required from user
{ printf("\nPlease enter file name to Print:\n"); scanf("%s",file_name); ptr_file =
fopen(file_name, "w"); if (!ptr_file) // Checking file name given user is exis t or
not { printf("no file...\n\n"); if (print_choice =3) print_choice = 1; else break;
} else fclose(ptr_file); } switch(order_choice) { case 1: // Inorder case
if(print_choice == 1 || print_choice == 3) // Checking whether output should be
shown immediately { printf("\nin order print:\n"); in_order_print(root); }
if(print_choice == 2 || print_choice == 3) // Checking whether output should be
saved in file or not. { in_order_save(root,file_name); printf("\nData successfully
printed in file.\n"); } break; case 2: // preorder case if(print_choice == 1 ||
print_choice == 3) { printf("\npre order print:\n"); pre_order_print(root); }
if(print_choice == 2 || print_choice == 3) { pre_order_save(root,file_name);
printf("\nData successfully printed in file.\n"); } break; case 3: // postorder
case if(print_choice == 1 || print_choice == 3) { printf("\npost order print:\n");
post_order_print(root); } if(print_choice == 2 || print_choice == 3)
{ post_order_save(root,file_name); printf("\nData successfully printed in
file.\n"); } break; } } else printf("\nTree doesn't exist\n"); // Dispalying info
if tre e is not created till now. break; case 3: // Termination of the program
exit=0; break; } } }

You might also like