构造二叉树,打印二叉树图形

  1 #include <iostream>
  2 #include <cmath>
  3 using namespace std;
  4 struct node
  5 {
  6     char c;
  7     int n;
  8     int level;
  9     struct node* lc;
 10     struct node* rc;
 11 };
 12 char pre[100];
 13 char in[100];
 14 char post[100];
 15 struct node* create_node()
 16 {
 17     struct node* p = new struct node;
 18     p->lc = p->rc = NULL;
 19     return p;
 20 }
 21 struct node* build_in_post(int s1, int e1, int s2, int e2)
 22 {
 23     struct node* p = create_node();
 24     for (int i = s1; i <= e1; i++)
 25     {
 26         if (post[e2] == in[i])
 27         {
 28             p->c = post[e2];
 29             if (i != s1)
 30             {
 31                 p->lc = build_in_post(s1, i - 1, s2, s2 + i - s1 - 1);
 32             }
 33             if (i != e1)
 34             {
 35                 p->rc = build_in_post(i + 1, e1, e2 - e1 + i, e2 - 1);
 36             }
 37             break;
 38         }
 39     }
 40     return p;
 41 }
 42 struct node* build_pre_in(int s1, int e1, int s2, int e2)
 43 {
 44     struct node* p = create_node();
 45     for (int i = s2; i <= e2; i++)
 46     {
 47         if (pre[s1] == in[i])
 48         {
 49             p->c = pre[s1];
 50             if (i != s2)
 51             {
 52                 p->lc = build_pre_in(s1 + 1, s1 + i - s2, s2, i - 1);
 53             }
 54             if (i != e2)
 55             {
 56                 p->rc = build_pre_in(s1 + i - s2 + 1, e1, i + 1, e2);
 57             }
 58             break;
 59         }
 60     }
 61     return p;
 62 }
 63 void pre_tra(struct node* t)
 64 {
 65     if (t)
 66     {
 67         cout << t->n << " ";
 68         if (t->lc)
 69             pre_tra(t->lc);
 70         if (t->rc)
 71             pre_tra(t->rc);
 72     }
 73 }
 74 void in_tra(struct node* t)
 75 {
 76     if (t)
 77     {
 78         if (t->lc)
 79             in_tra(t->lc);
 80         cout << t->n << " ";
 81         if (t->rc)
 82             in_tra(t->rc);
 83     }
 84 }
 85 void post_tra(struct node* t)
 86 {
 87     if (t)
 88     {
 89         if (t->lc)
 90             post_tra(t->lc);
 91         if (t->rc)
 92             post_tra(t->rc);
 93         cout << t->n <<" ";
 94     }
 95 }
 96 int get_h(struct node* t)
 97 {
 98     if (t)
 99     {
100         return get_h(t->lc) > get_h(t->rc) ? get_h(t->lc) + 1 : get_h(t->rc) + 1;
101     }
102     return 0;
103 }
104 int find_max(struct node* t)
105 {
106     if (t->rc)
107         return(find_max(t->rc));
108     else
109         return t->n;
110 }
111 int find_min(struct node* t)
112 {
113     if (t->lc)
114         return(find_min(t->lc));
115     else
116         return t->n;
117 }
118 void print_tree_int(struct node* t)
119 {
120     if (t)
121     {
122         struct node* q1[100];
123         int r1 = -1;
124         int f1 = -1;    
125         t->level = 1;
126         q1[++f1] = t;
127         int max_level = get_h(t);
128         while (r1 != f1)
129         {    
130             struct node* p = q1[++r1];
131             if (p->n == 0)
132             {
133                         if (p->level == max_level)break;
134                         q1[++f1] = create_node();
135                         q1[f1]->n = 0;
136                         q1[f1]->level = p->level + 1;
137                         q1[++f1] = create_node();
138                         q1[f1]->n = 0;
139                         q1[f1]->level = p->level + 1;
140             }
141             else
142             {
143                 if (p->level == max_level)break;
144                 if (p->lc)
145                 {
146                     p->lc->level = p->level + 1;
147                     q1[++f1] = p->lc;
148                 }
149                 else
150                 {
151                     struct node* pt = create_node();
152                     if (pt != NULL)
153                     {
154                         pt->n = 0;
155                         pt->level = p->level + 1;
156                         q1[++f1] = pt;
157                     }
158 
159                 }
160                 if (p->rc)
161                 {
162                     p->rc->level = p->level + 1;
163                     q1[++f1] = p->rc;
164                 }
165                 else
166                 {
167                     struct node* pt =create_node();
168                     if (pt != NULL)
169                     {
170                         pt->n = 0;
171                         pt->level = p->level + 1;
172                         q1[++f1] = pt;
173                     }
174                 }
175             }
176         }
177         int div = 1;
178         int width = 128;
179         int base[20];
180         base[0] = width;
181         r1 = -1;
182         base[max_level] = width / pow(2, max_level);
183         for (int i = max_level - 1; i >= 1; i--)
184         {
185             base[i] = base[i + 1] * 2;
186         }
187         int first[20] = { 0 };
188         for (int i = 1; i <= max_level; i++)
189         {
190             for (int j = i; j <= max_level; j++)
191             {
192                 first[i] += base[j]/2;
193             }
194         }
195         for (int i = 1; i <= max_level; i++)
196         {
197             int inc = base[i - 1];
198             if (i == 5)first[i] = 0;
199             for (int j = 0; j < first[i]; j++)
200             {
201                 cout << "-";
202             }
203             int cnt = 0;
204             while (r1 != f1 && q1[r1 + 1]->level == i)
205             {
206                 if (q1[r1 + 1]->n >= 10 && q1[r1 + 1]->n < 100)inc -= 1;
207                 else if (q1[r1 + 1]->n >= 1000 && q1[r1+1]->n < 10000)inc -= 2;
208                 else if (q1[r1 + 1]->n >= 10000)inc -= 3;
209                 if (i == 4 && cnt == 1)inc -= 1;
210                 if (i == 4 && cnt == 5)inc -= 2;
211                 if (i == 5 && cnt == 0)inc += 1;
212                 if (i == 5 && (cnt == 1 || cnt == 5 || cnt ==7  ||cnt == 13))inc -= 1;
213                 if (i == 5 && (cnt == 3)||(cnt == 10))inc -= 2;        
214                 if (i == 5 && cnt == 11)inc -= 3;
215                 cnt++;                
216                 cout << q1[++r1]->n;
217                 for (int k = 0; k < inc; k++)
218                 {
219                     cout << "-";
220                 }
221              inc = base[i - 1];
222             }
223             cout << endl;
224         }
225             cout << endl;
226     }
227 }
228 void print_tree_char(struct node* t)
229 {
230     if (t)
231     {
232         struct node* q1[100];
233         int r1 = -1;
234         int f1 = -1;
235         t->level = 1;
236         q1[++f1] = t;
237         int max_level = get_h(t);
238         while (r1 != f1)
239         {
240             struct node* p = q1[++r1];
241             if (p->n == 0)
242             {
243                 if (p->level == max_level)break;
244                 q1[++f1] = create_node();
245                 q1[f1]->c = '#';
246                 q1[f1]->level = p->level + 1;
247                 q1[++f1] = create_node();
248                 q1[f1]->c = '#';
249                 q1[f1]->level = p->level + 1;
250             }
251             else
252             {
253                 if (p->level == max_level)break;
254                 if (p->lc)
255                 {
256                     p->lc->level = p->level + 1;
257                     q1[++f1] = p->lc;
258                 }
259                 else
260                 {
261                     struct node* pt = create_node();
262                     if (pt != NULL)
263                     {
264                         pt->c = '#';
265                         pt->level = p->level + 1;
266                         q1[++f1] = pt;
267                     }
268 
269                 }
270                 if (p->rc)
271                 {
272                     p->rc->level = p->level + 1;
273                     q1[++f1] = p->rc;
274                 }
275                 else
276                 {
277                     struct node* pt = create_node();
278                     if (pt != NULL)
279                     {
280                         pt->c = '#';
281                         pt->level = p->level + 1;
282                         q1[++f1] = pt;
283                     }
284                 }
285             }
286         }
287         int div = 1;
288         int width = 128;
289         int base[20];
290         base[0] = width;
291         r1 = -1;
292         base[max_level] = width / pow(2, max_level);
293         for (int i = max_level - 1; i >= 1; i--)
294         {
295             base[i] = base[i + 1] * 2;
296         }
297         int first[20] = { 0 };
298         for (int i = 1; i <= max_level; i++)
299         {
300             for (int j = i; j <= max_level; j++)
301             {
302                 first[i] += base[j] / 2;
303             }
304         }
305         for (int i = 1; i <= max_level; i++)
306         {
307             int inc = base[i - 1];
308             if (i == 5)first[i] = 0;
309             for (int j = 0; j < first[i]; j++)
310             {
311                 cout << "-";
312             }
313             int cnt = 0;
314             while (r1 != f1 && q1[r1 + 1]->level == i)
315             {
316                 if (i == 4 && cnt == 1)inc -= 1;
317                 if (i == 4 && cnt == 5)inc -= 2;
318                 if (i == 5 && cnt == 0)inc += 1;
319                 if (i == 5 && (cnt == 1 || cnt == 5 || cnt == 7 || cnt == 13))inc -= 1;
320                 if (i == 5 && (cnt == 3) || (cnt == 10))inc -= 2;
321                 if (i == 5 && cnt == 11)inc -= 3;
322                 cnt++;
323                 cout << q1[++r1]->c;
324                 for (int k = 0; k < inc; k++)
325                 {
326                     cout << "-";
327                 }
328                 inc = base[i - 1];
329             }
330             cout << endl;
331         }
332         cout << endl;
333     }
334 }
335 void bracket_print_char(struct node* t)
336 {
337     if (t)
338     {
339         cout << t->c;
340         if (t->lc)
341         {                
342             cout << "(";
343             bracket_print_char(t->lc);        
344         }
345         if (t->rc)
346         {
347             if (!t->lc)
348             {
349                 cout << "(";
350             }
351             cout << ",";
352             bracket_print_char(t->rc);        
353         }
354         if(t->rc || t->lc)
355             cout << ")";
356     }
357     else
358     {
359         return;
360     }
361 }
362 void bracket_print_int(struct node* t)
363 {
364     if (t)
365     {
366         cout << t->n;
367         if (t->lc)
368         {
369             cout << "(";
370             bracket_print_int(t->lc);
371         }
372         if (t->rc)
373         {
374             if (!t->lc)
375             {
376                 cout << "(";
377             }
378             cout << ",";
379             bracket_print_int(t->rc);
380         }
381         if (t->rc || t->lc)
382             cout << ")";
383     }
384     else
385     {
386         return;
387     }
388 }
389 struct node* insert(struct node* head, int num)
390 {
391     if (!head)
392     {
393         head = create_node();
394         head->n = num;
395     }
396     else
397     {
398         if (num <= head->n)
399         {
400             head->lc = insert(head->lc, num);
401         }
402         else if (num > head->n)
403         {
404             head->rc = insert(head->rc, num);
405         }
406     }
407     return head;
408 }
409 int main()
410 {
411     cout <<endl<< "-----------------------根据给出的一组数据构造二叉树-------------------------" << endl;
412     cout << "数字个数:";
413     int n1;
414     cin >> n1;
415     int num[100];
416     for (int i = 0; i < n1; i++)
417     {
418         cin >> num[i];
419     }
420     struct node* head2 = NULL;
421     for (int i = 0; i < n1; i++)
422     {
423         head2 = insert(head2, num[i]);
424     }
425     cout << "前序遍历:";
426     pre_tra(head2);
427     cout << endl;
428     cout << "中序遍历:";
429     in_tra(head2);
430     cout << endl;
431     cout << "后序遍历:";
432     post_tra(head2);
433     cout << endl;
434     cout << "深度:" << get_h(head2) << endl;
435     cout << "最大值:" << find_max(head2) << endl;
436     cout << "最小值:" << find_min(head2) << endl;
437     cout << "嵌套括号表示:";
438     bracket_print_int(head2);
439     cout << endl;
440     cout << "根据输入数据构造:" << endl;
441     if (get_h(head2) <= 5)
442     {
443         cout << "图形:(0表示没有结点)" << endl;
444         print_tree_int(head2);
445     }
446     else
447     {
448         cout << "深度大于5,无法输出" << endl;
449     }
450     cout << "-----------------------根据前中序,中后序构造二叉树-------------------------" <<endl << endl;
451     cout << "前序:"; cin >> pre;
452     cout << "中序:"; cin >> in;
453     cout << "后序:"; cin >> post;
454     int n = strlen(pre);
455     struct node* head = build_pre_in(0, n - 1, 0, n - 1);
456     struct node* head1 = build_in_post(0, n - 1, 0, n - 1);
457     int h1 = get_h(head);
458     int h2 = get_h(head1);
459 
460     cout << "根据前中序构造:" << endl;
461     cout << "嵌套括号表示:";
462     bracket_print_char(head);    
463     cout << endl;
464     cout << "深度:" << h2 << endl;
465     if (h1 <= 5)
466     {
467         cout << "图形:('#'表示没有结点)" << endl;
468         print_tree_char(head);
469     }
470     else
471     {
472         cout << "深度大于5,无法打印图形" << endl;
473     }
474     cout << endl;
475     cout << "根据中后序构造:" << endl;
476     cout << "嵌套括号表示:";
477     bracket_print_char(head1);
478     cout << endl;    
479     cout << "深度:" << h2 << endl;
480     if (h1 <= 5)
481     {
482         cout << "图形:('#'表示没有结点)" << endl;
483         print_tree_char(head1);
484     }
485     else
486     {
487         cout << "深度大于5,无法打印图形" << endl;
488     }
489     return 0;
490 }

测试用例:

8

12 33 234 1 44 32 11 9

ABCDEF

CBDAEF

CDBFEA

结果:

原文地址:https://www.cnblogs.com/2020R/p/12968672.html