BST最长路径的平均值

Average of the longest path of a BST

本文关键字:平均值 路径 BST      更新时间:2023-10-16

我试图从BST的最长路径中找到int类型的数据的总和和平均值。我制作了以下函数:

int table::longest(){
   return longest(root);
}
int table::longest(node* curr){
   int suml = 0;
   int sumr = 0;
    if(!curr)
        return 0;
    int hleft = height(curr->left);
    int hright = height(curr->right);
    if(hleft > hright){
        suml = curr->data;
        return  suml += longest(curr->left);
    }
    sumr = curr->data;
    return sumr += longest(curr->right);
}
int table::height(node* curr){
    if(!curr)
        return 0;
    int hLeft = 1 +  height(curr->left);
    int hRight = 1 + height(curr->right);
    if(hLeft > hRight)
        return hLeft;
    return hRight;
}

函数longest向我返回数据的总和,但如何在不再次遍历树的情况下返回其平均值,以计算出最长路径中有多少节点?

EDIT:私有函数longest的原型必须是int longest(node* root),它必须向公共函数返回平均值或至少元素的总和,这样它才能在知道总和的情况下返回平均值

您的代码没有经过优化。从不建议不必要地重复遍历。您可以使用下面给出的函数。它将在O(n(时间内完成任务,其中n是二叉树中的节点数。

int maxHeight = 0;
int longestPathSum = 0;
int table::longest(){
   longest(root, 0, 0);
   return longestPathSum;
}
void table::longest(node* curr, int sum, int height){
    if(curr == NULL) return 0;
    sum += curr->data;
    if(++height > maxHeight) {
        maxHeight = height;
        longestPathSum =  sum;
    }       
    longest(curr->left, sum, height);
    longest(curr->right, sum, height);
}

从BST 的最长路径中找到int类型数据的总和和平均值

sum=longestPathSum;

average=longestPathSum/maxHeight;

您可以传递权重和高度的总和作为参考,而不是函数"最长"返回权重的总和。这将允许不遍历BST两次。