1

ツリーのノード内のいくつかのデータの平均を見つける関数を作成しようとしています。問題は、すべてのノードに2つのデータが含まれており、他のBSTとは異なり、ノードが構築されるプライマリデータは文字列であるということです。ツリー内の数値ベースの要素の平均を見つけることは私にとって問題ではありませんが、各ノードには文字列(人の名前)と一見乱数(その人の体重)が含まれているため、ツリーは実際には完全です混乱し、私はそれに対処する方法がわかりません。これが私のノードなので、私の意味がわかります。

struct Node {
    string name;
    double weight;
    Node* leftChild;
    Node* rightChild;
};
Node* root;

多くの段階の1つでの関数は次のとおりです。

 // This isn't what I'm actually using so don't jump to conclusions
 double nameTree::averageWeight(double total, double total, int count) const
 {
     if (parent != NULL)
     {      //nonsense, nonsense
        averageWeight(parent->leftChild, total, count);
        averageWeight(parent->rightChild, total, count);
        count++;                                 
        total = total + parent->weight;      
        return total;
     }
     return (total / count);
}

ツリーをトラバースするために、再帰を試みましたが、すべてをカウントして合計するたびに、何かが厄介になり、毎回リターン(合計/カウント)を実行することになります。また、ツリーをトラバースして配列に重みを追加することで配列の実装を試しましたが、戻り値と再帰が干渉するなどの理由で機能しませんでした。

そして、誰かが尋ねようとしていることを私が知っているという理由だけで、はい、これは学校の割り当てのためです。ただし、これはクラス内の18の関数のうちの1つであるため、誰かにこれを実行するように依頼しているわけではありません。私はこの1つの機能を何時間も使用していて、一晩中起きていて、脳が痛いので、どんな助けでも大歓迎です!

4

2 に答える 2

2

次のようなことを試すことができます:

    //total number of tree nodes
static int count=0;


 // Calculate the total sum of the weights in the tree 
double nameTree::calculateWeight(Node *parent)   
{   
    double total=0;

    if (parent != NULL)       
    {      
        //nonsense, nonsense    
        //Calculate total weight for left sub-tree
        total+=calculateWeight(parent->leftChild); 
        //Calculate weight for right sub-tree
        total+=calculateWeight(parent->rightChild);  
        //add current node weight
        total+=parent->weight;                                                       
    } 
    count++;   
    //if it is a leaf it will return 0
    return total;   
}  

double averageWeight()
{
    double weightSum;

    weightSum=calculateWeight();

    if(count!=0)
        return (weightSum/count);
    else
    {
        cout<<"The tree is empty";
        return 0;
    }
}

ここにはコンパイラはありませんが、動作すると思います。

于 2012-04-20T12:41:15.150 に答える
0

平均を計算するには、合計値とセット内の要素数の 2 つの数値が必要です。pair<double,int>ツリーをたどり、それらの値で a を返すか、参照として渡された引数を変更して 2 つの値を格納する関数を提供する必要があります (再帰はおそらく最も単純です) 。

コードの時点で、 をaverageWeight返しますがdouble、再帰的に呼び出すと、結果を無視 (破棄) します。引数はコピーによって渡されます。これは、再帰呼び出しで適用された変更が呼び出し元から見えないことを意味します (呼び出し元は、結果に対してcountどれだけ重み付けparent->weightする必要があるかを知りません。

始めるにはこれで十分です。

于 2012-04-20T12:29:25.833 に答える