Определить логическую функцию для данной программы, проверяющую, есть ли в непустом дереве хотя бы два одинаковых символа.
Код:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct node;
typedef char tree_data;
typedef node * link;
struct node {
tree_data data;
link r;
link l;
};
link q;
int i, k, n, c;
char ch;
static int leaf_level, flowing_level, result, b; //для action ()
void insert_tree (link &, int);
void del (link &);
void delete_tree (link &, tree_data);
void print_tree (link);
int action (link);
int main () {
srand (time(0));
link tree = 0;
for (;;) {
printf (
"\n MENU :"
"\n0. Exit"
"\n1. Generation random binary tree"
"\n2. Add to tree"
"\n3. Delete node"
"\n4. Print tree"
"\n5. Execute action"
"\n\nInput number ==> ");
scanf("%d", &k);
switch (k) {
case 0 :
printf ("\nProgram close\n");
return 0;
case 1 :
printf ("\nInput number of elements in the tree ==> ");
scanf ("%d", &n);
for (i = 0; i < n; i++) {
c = 'a' + rand() % ('z' - 'a');
insert_tree (tree, c);
}
break;
case 2 :
printf ("\nWhich item to add ? ==> ");
scanf (" %c", &ch);
insert_tree (tree, ch);
break;
case 3 :
if (tree) {
printf ("\nWhich item to delete ? ==> ");
scanf (" %c", &ch);
delete_tree (tree, ch);
}
else
printf ("\nNot tree");
break;
case 4 :
if (tree) {
printf ("\nBinary tree : \n\n");
print_tree (tree);
}
else
printf ("\nNot tree");
break;
case 5 :
if (tree) {
leaf_level = 0; flowing_level = 0; result = 0; b = 1;
n = action (tree);
if (n)
printf ("\nAll the leaves of a tree are "
"located on the %d level\n", n);
else
printf ("\nThe leaves of a tree are "
"located on different levels\n");
}
else
printf ("\nNot tree");
break;
}
}
return 0;
}
void insert_tree (link &t, int d) {
if (t) {
if (t->data < d)
insert_tree (t->r, d);
else if (t->data > d)
insert_tree (t->l, d);
}
else {
t = new node;
t->data = d;
t->r = 0;
t->l = 0;
}
}
void delete_tree (link &t, tree_data v) {
if (t)
if(v < t->data)
delete_tree (t->l, v);
else if (v > t->data)
delete_tree (t->r, v);
else if (!(t->r))
t = t->l;
else if (!(t->l))
t = t->r;
else {
q = t;
del (q->l);
}
}
void del (link &t) {
if (t->r)
del (t->r);
else {
q->data = t->data;
q = t;
t = t->l;
}
}
void print_tree (link t) {
static int s = 0;
s++;
if (t) {
print_tree(t->r);
for (i = 0; i < s; i++)
printf (" ");
if ((t->l) || (t->r))
printf ("\\__%c\n", t->data);
else //листья распечатаем в круглых скобках (для удобства)
printf ("\\__(%c)\n", t->data);
print_tree(t->l);
}
s--;
}
int action (link t) {
if (t) {
flowing_level++;
action (t->r);
if (!(t->r) && !(t->l)) {
leaf_level = flowing_level;
if ((result != 0) && (result != leaf_level)) {
b = 0;
return 0;
}
else if (result == 0)
result = leaf_level;
}
action (t->l);
flowing_level--;
}
if (b)
return result;
else
return 0;
}