fig12_19_mod2.c (3574B)
1 /* Exercise 12.17 */ 2 3 /* Fig. 12.19: fig12_19.c 4 Create a binary tree and traverse it 5 preorder, inorder, and postorder */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <string.h> 9 10 #define SIZE 100 11 12 /* self-referential structure */ 13 struct treeNode { 14 struct treeNode *leftPtr; /* pointer to left subtree */ 15 char data[SIZE]; /* node value */ 16 struct treeNode *rightPtr; /* pointer to right subtree */ 17 }; /* end structure treeNode */ 18 19 typedef struct treeNode TreeNode; /* synonym for struct treeNode */ 20 typedef TreeNode *TreeNodePtr; /* synonym for TreeNode* */ 21 22 /* prototypes */ 23 void insertNode( TreeNodePtr *treePtr, char *string ); 24 void inOrder( TreeNodePtr treePtr ); 25 void preOrder( TreeNodePtr treePtr ); 26 void postOrder( TreeNodePtr treePtr ); 27 28 /* function main begins program execution */ 29 int main(void) 30 { 31 TreeNodePtr rootPtr = NULL; /* tree initially empty */ 32 char string[SIZE], *tokp; 33 34 printf("Insert a phrase: "); 35 fgets(string, SIZE, stdin); 36 printf( "The current string being placed in the tree are:\n" ); 37 printf("%s\n", string); 38 39 tokp = strtok(string, " "); 40 while( tokp != NULL ) { 41 insertNode( &rootPtr, tokp ); 42 tokp = strtok(NULL, " "); 43 } 44 45 /* traverse the tree preOrder */ 46 printf( "\nThe preOrder traversal is:\n" ); 47 preOrder( rootPtr ); 48 49 /* traverse the tree inOrder */ 50 printf( "\n\nThe inOrder traversal is:\n" ); 51 inOrder( rootPtr ); 52 53 /* traverse the tree postOrder */ 54 printf( "\n\nThe postOrder traversal is:\n" ); 55 postOrder( rootPtr ); 56 57 putchar('\n'); 58 59 return 0; /* indicates successful termination */ 60 61 } /* end main */ 62 63 /* insert node into tree */ 64 void insertNode( TreeNodePtr *treePtr, char *string ) 65 { 66 67 /* if tree is empty */ 68 if ( *treePtr == NULL ) { 69 *treePtr = malloc( sizeof( TreeNode ) ); 70 71 /* if memory was allocated then assign data */ 72 if ( *treePtr != NULL ) { 73 strncpy( ( *treePtr )->data, string, SIZE ); 74 ( *treePtr )->leftPtr = NULL; 75 ( *treePtr )->rightPtr = NULL; 76 } /* end if */ 77 else { 78 printf( "%s not inserted. No memory available.\n", string ); 79 } /* end else */ 80 81 } /* end if */ 82 else { /* tree is not empty */ 83 84 /* data to insert is less than data in current node */ 85 if ( memcmp(string, ( *treePtr )->data, SIZE) <= 0 ) { 86 insertNode( &( ( *treePtr )->leftPtr ), string ); 87 } /* end if */ 88 89 /* data to insert is greater than data in current node */ 90 else { 91 insertNode( &( ( *treePtr )->rightPtr ), string ); 92 } /* end else if */ 93 94 } /* end else */ 95 96 } /* end function insertNode */ 97 98 /* begin inorder traversal of tree */ 99 void inOrder( TreeNodePtr treePtr ) 100 { 101 102 /* if tree is not empty then traverse */ 103 if ( treePtr != NULL ) { 104 inOrder( treePtr->leftPtr ); 105 printf( "%s ", treePtr->data ); 106 inOrder( treePtr->rightPtr ); 107 } /* end if */ 108 109 } /* end function inOrder */ 110 111 /* begin preorder traversal of tree */ 112 void preOrder( TreeNodePtr treePtr ) 113 { 114 115 /* if tree is not empty then traverse */ 116 if ( treePtr != NULL ) { 117 printf( "%s ", treePtr->data ); 118 preOrder( treePtr->leftPtr ); 119 preOrder( treePtr->rightPtr ); 120 } /* end if */ 121 122 } /* end function preOrder */ 123 124 /* begin postorder traversal of tree */ 125 void postOrder( TreeNodePtr treePtr ) 126 { 127 128 /* if tree is not empty then traverse */ 129 if ( treePtr != NULL ) { 130 postOrder( treePtr->leftPtr ); 131 postOrder( treePtr->rightPtr ); 132 printf( "%s ", treePtr->data ); 133 } /* end if */ 134 135 } /* end function postOrder */ 136