Exemple #1
0
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;
}
Exemple #2
0
pair is_balanced_binary_tree(tree *root) {
    return check_balanced(root);
}
Exemple #3
0
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;
}