pair check_balanced(tree *root) { pair p, right_result, left_result; int is_balanced, height; if (root == NULL) { p.balanced = 1; p.height = -1; return p; } left_result = check_balanced(root->left); if (!left_result.balanced) { p.balanced = 0; p.height = 0; return p; } right_result = check_balanced(root->right); if (!right_result.balanced) { p.balanced = 0; p.height = 0; return p; } is_balanced = ABS(left_result.height - right_result.height) <= 1; height = MAX(left_result.height, right_result.height) + 1; p.balanced = is_balanced; p.height = height; return p; }
pair is_balanced_binary_tree(tree *root) { return check_balanced(root); }
uint8_t * print_original_if(lexical * lexer, uint8_t size) { uint8_t i=0; uint8_t ret = verificar_expresion(lexer, size); if(ret == 0) return NULL; uint8_t formato = 0; uint16_t len = get_len_numbers(lexer, size); formato = strlen("(\n"); if(lexer->token == ELIF) //NUEVO formato += 3; uint16_t len_strcmp = buscar_string_comparation(lexer, size); if(len > 0) formato += len_strcmp; uint8_t temp[formato+len+1]; uint8_t parentesis = busca_parentesis(lexer, size); memset(temp, 0, sizeof(temp)); str_cat(temp, lexer->valor, lexer->token); //NUEVO strcat(temp, "("); lexer = lexer->next; size -= 1; uint8_t last_token = 0; uint8_t token_t1 = 0; uint8_t token_t2 = 0; uint8_t temp_token = 0; for(i=0;i<size;i++) { if(lexer->token == INT) strcat(temp, "atoi"); else if(lexer->token == LEN) strcat(temp, "strlen"); else if(lexer->token == FLOAT_F ) strcat(temp, "atof"); else if(lexer->token == DOS_PUNTOS) strcat(temp, ")"); else if(lexer->token == AND) strcat(temp, "&&"); else if(lexer->token == OR) strcat(temp, "||"); else if(lexer->token == NOT) strcat(temp, "!"); else if(lexer->token == STRCMP || temp_token == STRCMP) { if(temp_token == 0) { strcat(temp, "strcmp("); strcat(temp, lexer->valor); strcat(temp, ","); temp_token = lexer->token; } else if(lexer->token == IGUAL || lexer->token == DISTINTO) { if(token_t1 == 0) token_t1 = lexer->token; else token_t2 = lexer->token; } else if((token_t1 != 0 && token_t2 != 0) && (lexer->token == CADENA || lexer->token == VARIABLE)) { strcat(temp, lexer->valor); strcat(temp, ")"); if(token_t1 == IGUAL) strcat(temp, "="); else if(token_t1 == DISTINTO) strcat(temp, "!"); if(token_t2 == IGUAL) strcat(temp, "="); strcat(temp, "0"); temp_token = 0; token_t1 = 0; token_t2 = 0; } } else { strcat(temp, lexer->valor); } last_token = lexer->token; lexer = lexer->next; } if(parentesis > 0) { if(!check_balanced(temp, IF)) { debug("\nError en linea %d: los parentesis no estan balanceados\n", linea); return NULL; } } sprintf(temp, "%s\n{", temp); uint8_t * retorna = (uint8_t *)malloc(strlen(temp)+1); if(retorna == NULL) { debug("\nError: ocurrio un inconveniente en la heap\n"); return NULL; } strcpy(retorna, temp); return retorna; }