@@ -19,104 +19,193 @@ Exercise
1919
2020Below is an implementation of a binary tree that has insertion and printing capabilities. This tree is ordered but not balanced. This example maintains its ordering at insertion time.
2121
22+ Change the print routine to depth-first search ** pre-order** .
23+
2224
2325Tutorial Code
2426-------------
2527
2628 #include <stdio.h>
2729 #include <stdlib.h>
28-
29- typedef struct node {
30+
31+ typedef struct node
32+ {
3033 int val;
3134 struct node * left;
32- struct node * right;} node_t;
33-
35+ struct node * right;
36+ } node_t;
37+
3438 void insert(node_t * tree,int val);
3539 void print_tree(node_t * current);
3640 void printDFS(node_t * current);
37-
38- int main() {
41+
42+ int main()
43+ {
3944 node_t * test_list = malloc(sizeof(node_t));
45+ /* set values explicitly, alternative would be calloc() */
46+ test_list->val = 0;
47+ test_list->left = NULL;
48+ test_list->right = NULL;
49+
4050 insert(test_list,5);
4151 insert(test_list,8);
4252 insert(test_list,4);
4353 insert(test_list,3);
44- printDFS(test_list);}
45-
46- void insert(node_t * tree,int val){
47- if(tree->val==NULL)tree->val=val;
48- else if(val<tree->val)
49- if(tree->left!=NULL)insert(tree->left,val);
50- else{
51- tree->left=malloc(sizeof(node_t));
52- tree->left->val=val; }
53- else if(val>=tree->val)
54- if(tree->right!=NULL)insert(tree->right,val);
55- else{
56- tree->right=malloc(sizeof(node_t));
57- tree->right->val=val;} }
58-
59- void print_tree(node_t * current) {
60- if(current!=NULL)printf("\n%d ",current->val);
61- if(current->left!=NULL) printf("L%d ",current->left->val);
62- if(current->right!=NULL)printf(" R%d",current->right->val);
63- if(current->left!=NULL) print_tree(current->left);
64- if(current->right!=NULL)print_tree(current->right);}
65-
66- void printDFS(node_t * current) {
67- if(current->left!=NULL) printDFS(current->left);
68- if(current!=NULL)printf("%d ",current->val);
69- if(current->right!=NULL)printDFS(current->right);}
54+
55+ printDFS(test_list);
56+ printf("\n");
57+ }
58+
59+ void insert(node_t * tree, int val)
60+ {
61+ if (tree->val == 0)
62+ {
63+ /* insert on current (empty) position */
64+ tree->val=val;
65+ }
66+ else
67+ {
68+ if (val < tree->val)
69+ {
70+ /* insert left */
71+ if (tree->left != NULL)
72+ {
73+ insert(tree->left, val);
74+ }
75+ else
76+ {
77+ tree->left = malloc(sizeof(node_t));
78+ /* set values explicitly, alternative would be calloc() */
79+ tree->left->val = val;
80+ tree->left->left = NULL;
81+ tree->left->right = NULL;
82+ }
83+ }
84+ else
85+ {
86+ if (val >= tree->val)
87+ {
88+ /* insert right */
89+ if (tree->right != NULL)
90+ {
91+ insert(tree->right,val);
92+ }
93+ else
94+ {
95+ tree->right=malloc(sizeof(node_t));
96+ /* set values explicitly, alternative would be calloc() */
97+ tree->right->val=val;
98+ tree->right->left = NULL;
99+ tree->right->right = NULL;
100+ }
101+ }
102+ }
103+ }
104+ }
105+
106+ /* depth-first search */
107+ void printDFS(node_t * current)
108+ {
109+ /* change the code here */
110+ if (current == NULL) return; /* security measure */
111+ if (current->left != NULL) printDFS(current->left);
112+ if (current != NULL) printf("%d ", current->val);
113+ if (current->right != NULL) printDFS(current->right);
114+ }
115+
70116
71117Expected Output
72118---------------
73119
74- 1 2 3 4
120+ 5 4 3 8
75121
76122Solution
77123--------
78124
79125 #include <stdio.h>
80126 #include <stdlib.h>
81-
82- typedef struct node {
127+
128+ typedef struct node
129+ {
83130 int val;
84131 struct node * left;
85- struct node * right;} node_t;
86-
132+ struct node * right;
133+ } node_t;
134+
87135 void insert(node_t * tree,int val);
88136 void print_tree(node_t * current);
89137 void printDFS(node_t * current);
90-
91- int main() {
138+
139+ int main()
140+ {
92141 node_t * test_list = malloc(sizeof(node_t));
142+ /* set values explicitly, alternative would be calloc() */
143+ test_list->val = 0;
144+ test_list->left = NULL;
145+ test_list->right = NULL;
146+
93147 insert(test_list,5);
94148 insert(test_list,8);
95149 insert(test_list,4);
96150 insert(test_list,3);
97- printDFS(test_list);}
98-
99- void insert(node_t * tree,int val){
100- if(tree->val=='\0')tree->val=val;
101- else if(val<tree->val)
102- if(tree->left!=NULL)insert(tree->left,val);
103- else{
104- tree->left=malloc(sizeof(node_t));
105- tree->left->val=val; }
106- else if(val>=tree->val)
107- if(tree->right!=NULL)insert(tree->right,val);
108- else{
109- tree->right=malloc(sizeof(node_t));
110- tree->right->val=val;} }
111-
112- void print_tree(node_t * current) {
113- if(current!=NULL)printf("\n%d ",current->val);
114- if(current->left!=NULL) printf("L%d ",current->left->val);
115- if(current->right!=NULL)printf(" R%d",current->right->val);
116- if(current->left!=NULL) print_tree(current->left);
117- if(current->right!=NULL)print_tree(current->right);}
118-
119- void printDFS(node_t * current) {
120- if(current->left!=NULL) printDFS(current->left);
121- if(current!=NULL)printf("%d ",current->val);
122- if(current->right!=NULL)printDFS(current->right);}
151+
152+ printDFS(test_list);
153+ printf("\n");
154+ }
155+
156+ void insert(node_t * tree, int val)
157+ {
158+ if (tree->val == 0)
159+ {
160+ /* insert on current (empty) position */
161+ tree->val=val;
162+ }
163+ else
164+ {
165+ if (val < tree->val)
166+ {
167+ /* insert left */
168+ if (tree->left != NULL)
169+ {
170+ insert(tree->left, val);
171+ }
172+ else
173+ {
174+ tree->left = malloc(sizeof(node_t));
175+ /* set values explicitly, alternative would be calloc() */
176+ tree->left->val = val;
177+ tree->left->left = NULL;
178+ tree->left->right = NULL;
179+ }
180+ }
181+ else
182+ {
183+ if (val >= tree->val)
184+ {
185+ /* insert right */
186+ if (tree->right != NULL)
187+ {
188+ insert(tree->right,val);
189+ }
190+ else
191+ {
192+ tree->right=malloc(sizeof(node_t));
193+ /* set values explicitly, alternative would be calloc() */
194+ tree->right->val=val;
195+ tree->right->left = NULL;
196+ tree->right->right = NULL;
197+ }
198+ }
199+ }
200+ }
201+ }
202+
203+ /* depth-first search */
204+ void printDFS(node_t * current)
205+ {
206+ /* change the code here */
207+ if (current == NULL) return; /* security measure */
208+ if (current != NULL) printf("%d ", current->val);
209+ if (current->left != NULL) printDFS(current->left);
210+ if (current->right != NULL) printDFS(current->right);
211+ }
0 commit comments