2014-11-23 3 views
-2

Я хочу рассчитать среднее значение. Дерево имеет 4 информации: данные, число, левое и правое. Среднее значение для всех узлов = умножается на данные и число/общее число.Рассчитать среднее число в двоичном дереве поиска

struct node{ 
int number; 
int data; 
struct node *right; 
struct node *left; 
} 
typedef struct node nod; 
typedef struct node* nodePtr; 
typedef struct node** nodePtrPtr; 
int main(){ 
nodePtr a=NULL; 

calAverage(&a); 
} 
void calAverage(nodePtrPtr tree){ 
{ 
    nodePtr g; 
    double average, sum=0,num,n,s=0; 
    int k,z=0; 
    int l,w=0; 

    if(tree){ 
    tree=g; 
    g->total_number_of_reviews=k; 
    g->scoreNumber=num; 
    sum+=(num*k); 
    z+=k; 
    } 


    if(tree->left){ 
    calAverage(tree->left);   
    } 

    if(tree->right){ 
    calAverage(tree->right);  
    } 

average=((sum+s)/(z+w)); 
printf("%.1lf average ",average);} 

Этот код не работает должным образом. Как вы думаете, я называю средний метод рекурсивно?

+1

1) член 'справа узел структуры; struct node left; '->' * right', '* left' – BLUEPIXY

+0

2)' nodePtr a; calAverage (&a); ':' a' не инициализируется. Его не присвоить значение. – BLUEPIXY

+0

На самом деле я пишу их, но не делаю добавьте эту страницу. Но мой вопрос о методе calAverage -> это правда? @BLUEPIXY – elminaa

ответ

0

ли рекурсивно

и попробовать это:

struct node{ 
    int number; 
    int data; 
    struct node *right; 
    struct node *left; 
}; 


void calAverage(node *tree) 
{ 

    node *g; 
    double average, sum=0,num,n,s=0; 
    int k,z=0; 
    int l,w=0; 
    g=tree; 

    while(g != NULL){ 
     k=g->number; 
     num=g->data; 
     sum+=(num*k); 
     z+=k; 
     g=g->right; 
     while(g != NULL){ 
      l=g->number; 
      n=g->data; 
      s+=(n*l); 
      w+=l; 
      g= g->left; 
     } 
    } 
    average=((sum+s)/(z+w)); 
    printf("%.1lf average ",average); 
} 


int main(int argc) 
{ 
    node *a=NULL; 
    calAverage(a); 

    scanf("%d"); 
    return 0; 
} 
0

Я сделал это, определив две глобальные переменные для хранения значения number*data и сумма всех данных. затем простая рекурсия

s=sumofproduct 
p=sumofdata 

void average(node *ptr,int *s,int *p) 
{ 
    if(ptr==NULL) 
    { 
    return ;  
    } 
    int k=ptr->data; 
    int l=ptr->number; 
    *p=(*p)+k*l; 
    *s=*s+ptr->data;  
    if(ptr->left) 
    average(ptr->left,s,p); 
    if((ptr->right)) 
    average(ptr->right,s,p); 
} 

затем в главном я напечатал sumofproduct/sumofdata

1

пример код

struct tree { 
    int value; 
    struct tree *left; 
    struct tree *right; 
}; 

int sum(struct tree *root){ 
    if(root == NULL) 
     return 0; 
    return root->value + sum(root->right) + sum(root->left); 
} 
int count(struct tree *root){ 
    if(root == NULL) 
     return 0; 
    return 1 + count(root->right) + count(root->left); 
} 
double ave(struct tree *root){ 
    return (double)sum(root)/count(root); 
} 
void sum_count(struct tree *root, int *sum, int *count){ 
    if(root != NULL){ 
     *sum += root->value; 
     ++*count; 
     sum_count(root->left, sum, count); 
     sum_count(root->right, sum, count); 
    } 
} 
double ave2(struct tree *root){ 
    int sum=0, count=0; 
    sum_count(root, &sum, &count); 
    return (double)sum/count; 
}