C++ 关于内部路径长度函数的问题

C++ 关于内部路径长度函数的问题,c++,tree,binary-search-tree,avl-tree,C++,Tree,Binary Search Tree,Avl Tree,我被要求计算二叉搜索树和AVL树中节点的平均深度。通过一些研究,我发现一棵树的平均深度是内部路径长度除以树中的节点数,而内部路径长度(树中每个节点的路径长度之和)是由该循环给出的: D(1) = 0, D(N) = D(i) + D(N − i − 1) + N − 1 其中D(N)是具有N个节点的树,D(i)是左子树的IPL,D(N-i-1)是右子树的IPL 使用该函数,我编写了以下函数: int internalPathLength(Node *t, int& sum) const

我被要求计算二叉搜索树和AVL树中节点的平均深度。通过一些研究,我发现一棵树的平均深度是内部路径长度除以树中的节点数,而内部路径长度(树中每个节点的路径长度之和)是由该循环给出的:

D(1) = 0, D(N) = D(i) + D(N − i − 1) + N − 1
其中D(N)是具有N个节点的树,D(i)是左子树的IPL,D(N-i-1)是右子树的IPL

使用该函数,我编写了以下函数:

int internalPathLength(Node *t, int& sum) const{
        if(t == nullptr || (t->left == nullptr && t->right == nullptr)) {
            return 0;
        }
        else {
            int a = 0;
            sum += internalPathLength(t->left, sum) + internalPathLength(t->right, sum) + (countNodes(t,a)-1);
            cout << sum << endl;
            return sum;
        }
int internalPathLength(Node*t,int&sum)常量{
如果(t==nullptr | |(t->left==nullptr&&t->right==nullptr)){
返回0;
}
否则{
int a=0;
sum+=internalPathLength(t->left,sum)+internalPathLength(t->right,sum)+(countNodes(t,a)-1);

cout问题是您通过引用传递
sum
,因此它的增量太多。您根本不需要这个总和。这应该可以:

int internalPathLength(Node *t) const{
        if(t == nullptr || (t->left == nullptr && t->right == nullptr)) {
            return 0;
        }
        else {
            return internalPathLength(t->left) + internalPathLength(t->right) + countNodes(t) - 1;
        }
    }
这不是最优的,因为计数函数可能也是递归的。 您可以在同一递归中计算每个子树中的节点数,然后使用它。如下所示:

int internalPathLength(Node *t, int &count) const{
        if(t == nullptr) {
            count = 0;
            return 0;
        }
        else if(t->left == nullptr && t->right == nullptr){
            count = 1;
            return 0;
        }
        else {
            count = 1;
            int leftCount;
            int rightCount;
            int sum = internalPathLength(t->left, leftCount) + internalPathLength(t->right, rightCount);

            count += leftCount + rightCount;

            return sum + count - 1;
        }
    }

我不能说函数在做什么,但不要使用引用。只需使用传递值,即int sum。还可以尝试使用1个节点,然后是2个节点,然后是5个节点…依此类推,这样您就可以推断您的答案。然后尝试565个节点。