我正在尝试创建一个函数,用于查找树节点内某些数据的平均值。问题是,每个节点都包含两个数据,与其他BST不同,构建它的主要数据是一个字符串。查找树中基于数字的元素的平均值对我来说不是问题,但由于每个节点都包含一个字符串(一个人的姓名)和一个看似随机的数字(所述人的权重),因此该树实际上是完整的混乱,我不知道如何处理它。 这是我的节点,所以你明白我的意思:
struct Node {
string name;
double weight;
Node* leftChild;
Node* rightChild;
};
Node* root;
以下是其中一个阶段的功能:
// 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个函数,所以它不像我要求任何人为我这样做。我已经在这个功能上工作了好几个小时了,我已经整晚都在上班,我的大脑很疼,所以任何帮助都会受到极大的赞赏!
答案 0 :(得分: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;
}
}
我这里没有编译器,但我相信它有效。
答案 1 :(得分:0)
要计算平均值,您需要两个数字:总值和集合中的元素数量。你需要提供一个函数(递归可能是最简单的),它将遍历树并返回带有这些值的pair<double,int>
,或者修改一些作为参考传递的参数来存储这两个值。
从您的代码开始,averageWeight
返回double
,但是当您以递归方式调用它时,您忽略(丢弃)结果。 count
参数是通过副本传递的,这意味着调用者将无法看到递归调用中应用的修改(然后他们不知道权重1}应该有多少parent->weight
>朝着结果。
这应该足以让你入门。