final
This commit is contained in:
parent
deee10505b
commit
6d9c7de58a
@ -12,8 +12,9 @@ struct tree {
|
||||
|
||||
struct tree* read_tree(int* counter){
|
||||
|
||||
|
||||
//read one node
|
||||
int* c = counter;
|
||||
|
||||
//printf("%d\n", *c);
|
||||
char buffer[50];
|
||||
memset(buffer,0,50);
|
||||
@ -26,24 +27,39 @@ struct tree* read_tree(int* counter){
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
if(buffer[0] != '\0'){
|
||||
struct tree* node = calloc(1,sizeof(struct tree));
|
||||
memcpy(node->value, buffer,50);
|
||||
|
||||
//count all nodes
|
||||
*c += 1;
|
||||
counter = c;
|
||||
|
||||
//until i find "*", recursively read tree
|
||||
if(buffer[0] != '*'){
|
||||
|
||||
//first check left side, if the isn't node, add it
|
||||
if(node->left == NULL){
|
||||
node->left = read_tree(counter);
|
||||
}
|
||||
|
||||
//than check right side
|
||||
if(node->right == NULL){
|
||||
node->right = read_tree(counter);
|
||||
}
|
||||
}
|
||||
|
||||
//if i found root with left and right node, decrease my counter
|
||||
if(node->left != NULL && node->right != NULL){
|
||||
*c -= 2;
|
||||
counter = c;
|
||||
}
|
||||
|
||||
//if binary tree is okay, than counter is 1(there is one root)
|
||||
if(*c == 1){
|
||||
|
||||
//if the user still inseting, than the databaze wrong
|
||||
r = fgets(buffer,50, stdin);
|
||||
int x = strlen(buffer);
|
||||
buffer[x-1]='\0';
|
||||
@ -59,35 +75,38 @@ struct tree* read_tree(int* counter){
|
||||
}
|
||||
void search(struct tree* this){
|
||||
|
||||
|
||||
char buffer[5];
|
||||
memset(buffer,0,5);
|
||||
char* r = fgets(buffer,5,stdin);
|
||||
//read answer
|
||||
char answer[5];
|
||||
memset(answer,0,5);
|
||||
char* r = fgets(answer,5,stdin);
|
||||
|
||||
if(r == NULL){
|
||||
printf("Koniec vstupu\n");
|
||||
exit(0);
|
||||
}
|
||||
if(buffer[0] == '\n'){
|
||||
|
||||
if(answer[0] == '\n'){
|
||||
search(this);
|
||||
}
|
||||
/*if(buffer[0] != 'a' || buffer[0] != 'n' || buffer[0] != '\n'){
|
||||
printf("Nerozumiem\n");
|
||||
exit(0);
|
||||
}*/
|
||||
|
||||
if(buffer[0] == 'a'){
|
||||
if(answer[0] == 'a'){
|
||||
|
||||
//if left node is answer, print it and end the program
|
||||
if(this->left->value[0] == '*'){
|
||||
printf("%s\n", this->left->value);
|
||||
printf("Koniec\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//else print it and continue searching
|
||||
printf("%s\n", this->left->value);
|
||||
search(this->left);
|
||||
|
||||
}
|
||||
|
||||
else if(buffer[0] == 'n'){
|
||||
else if(answer[0] == 'n'){
|
||||
|
||||
//the same for the right side
|
||||
if(this->right->value[0] == '*'){
|
||||
printf("%s\n", this->right->value);
|
||||
printf("Koniec\n");
|
||||
@ -98,26 +117,19 @@ void search(struct tree* this){
|
||||
|
||||
}
|
||||
else{
|
||||
|
||||
//if input is wrong
|
||||
printf("Nerozumiem\n");
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
void print_tree(struct tree* tree,int offset){
|
||||
int i;
|
||||
for (i = 0; i < offset; i++){
|
||||
printf(" ");
|
||||
}
|
||||
printf("%s",tree->value);
|
||||
if (tree->left){
|
||||
print_tree(tree->left,offset +3);
|
||||
print_tree(tree->right,offset +3);
|
||||
}
|
||||
}
|
||||
|
||||
void destroy_tree(struct tree* root){
|
||||
|
||||
//if root is NULL,than tree is empty
|
||||
if(root == NULL) return;
|
||||
|
||||
//go to the left side and than to the right
|
||||
destroy_tree(root->left);
|
||||
destroy_tree(root->right);
|
||||
free(root);
|
||||
@ -125,10 +137,14 @@ void destroy_tree(struct tree* root){
|
||||
}
|
||||
int count_leaves(struct tree* node){
|
||||
int count = 0;
|
||||
|
||||
//if left and right nodes are empty
|
||||
if(node->left == NULL && node->right == NULL){
|
||||
count = 1;
|
||||
count++;;
|
||||
}
|
||||
else{
|
||||
|
||||
//if left isn't NULL than count
|
||||
if(node->left != NULL){
|
||||
count += count_leaves(node->left);
|
||||
}
|
||||
@ -143,13 +159,14 @@ int count_all(struct tree* node){
|
||||
if(node == NULL){
|
||||
return 0;
|
||||
}
|
||||
int count = 1;
|
||||
int count = 0;
|
||||
if(node->left != NULL){
|
||||
count += count_all(node->left);
|
||||
}
|
||||
if(node->right != NULL){
|
||||
count += count_all(node->right);
|
||||
}
|
||||
count++;
|
||||
return count;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user