【问题标题】:Calculate Average Number in a Binary Search Tree计算二叉搜索树中的平均数
【发布时间】:2014-11-23 14:36:38
【问题描述】:

我想计算平均值。树有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) struct node right; struct node left; 的成员 --> *right, *left
  • 2) nodePtr a;calAverage(&a); : a 未初始化。它没有赋值。
  • 其实我写了这些,但没有添加这个页面。但我的问题是关于 calAverage 方法 --> 是真的吗? @BLUEPIXY
  • 我似乎按照路径不正确。递归处理很容易理解。
  • 您对正确的路径有什么建议吗? @BLUEPIXY

标签: c binary-search-tree average


【解决方案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;
}

【讨论】:

    【解决方案2】:

    递归执行

    试试这个:

    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;
    }
    

    【讨论】:

      【解决方案3】:

      我通过定义两个全局变量来存储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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2015-08-25
        • 1970-01-01
        相关资源
        最近更新 更多