计算存储为向量数组C+的一般树的每个节点的高度+; 我已经用C++中的向量数组的形式存储了一个树,这样每个行的第一列由该节点的子节点的总数组成,然后每行的后续列由该节点的所有子节点的索引组成。 vector <long long int> nodes[N];

计算存储为向量数组C+的一般树的每个节点的高度+; 我已经用C++中的向量数组的形式存储了一个树,这样每个行的第一列由该节点的子节点的总数组成,然后每行的后续列由该节点的所有子节点的索引组成。 vector <long long int> nodes[N];,c++,algorithm,data-structures,tree,C++,Algorithm,Data Structures,Tree,然后向量节点的数组将 0. 2 2 3 1. 2 4 5 2. 0 3. 2 6 7 4. 0 5. 1 8 6. 0 7. 0 现在,我想将每个节点的高度保存在一个大小为N的新数组中。 我怎样才能开发一个算法呢?您可以使用这个函数来计算树中每个节点的高度 它是一个根为0的树的简单DFS int height(vector<int> nodes[], vector<int> &arr, int u, int p){ int ans = 0; f

然后向量
节点的数组将

0. 2 2 3
1. 2 4 5
2. 0
3. 2 6 7
4. 0
5. 1 8
6. 0
7. 0

现在,我想将每个节点的高度保存在一个大小为N的新数组中。
我怎样才能开发一个算法呢?

您可以使用这个函数来计算树中每个节点的高度

它是一个根为
0
的树的简单DFS

int height(vector<int> nodes[], vector<int> &arr, int u, int p){
    int ans = 0;
    for(int i=1;i<=nodes[u][0];i++){
        if(nodes[u][i]!=p){
            ans=max(ans, height(nodes, arr, nodes[u][i], u));
        }
    }
    return arr[u] = 1 + ans;
}
int高度(向量节点[],向量和arr,int u,int p){
int ans=0;

对于(int i=1;i,可以使用此函数计算树中每个节点的高度

它是一个根为
0
的树的简单DFS

int height(vector<int> nodes[], vector<int> &arr, int u, int p){
    int ans = 0;
    for(int i=1;i<=nodes[u][0];i++){
        if(nodes[u][i]!=p){
            ans=max(ans, height(nodes, arr, nodes[u][i], u));
        }
    }
    return arr[u] = 1 + ans;
}
int高度(向量节点[],向量和arr,int u,int p){
int ans=0;

对于(inti=1;i,经过一些思考,我可以设计一个迭代解

int heights[N] = {0};
        
        for(long long int i = N-1;i>=0;i--){
            
            int max = 0;
            int no_child = nodes[i][0];
            
            for(int j=1;j<=no_child;j++){
                if(heights[nodes[i][j]] > max){
                    max = heights[nodes[i][j]];
                }
            }
            
            max++;
            heights[i] = max;
        }
int高度[N]={0};
对于(长整型i=N-1;i>=0;i--){
int max=0;
int no_child=节点[i][0];
对于(int j=1;j max){
最大值=高度[节点[i][j];
}
}
max++;
高度[i]=最大值;
}

经过思考,我可以设计出一个迭代解决方案

int heights[N] = {0};
        
        for(long long int i = N-1;i>=0;i--){
            
            int max = 0;
            int no_child = nodes[i][0];
            
            for(int j=1;j<=no_child;j++){
                if(heights[nodes[i][j]] > max){
                    max = heights[nodes[i][j]];
                }
            }
            
            max++;
            heights[i] = max;
        }
int高度[N]={0};
对于(长整型i=N-1;i>=0;i--){
int max=0;
int no_child=节点[i][0];
对于(int j=1;j max){
最大值=高度[节点[i][j];
}
}
max++;
高度[i]=最大值;
}

我想没有必要在每一行的第一列中存储子节点的数量,因为
节点[I].size()
是同一个数字。@risingStark是的,它是多余的,但我这样做是为了方便。我还认为你上面提到的邻接列表对于索引
3
是错误的。它应该是
3.267
。你可以在这里可视化你的图形@risingStark谢谢。那是个错误。我想不需要存储由于
节点[i].size()的
是同一个数字。@risingStark是的,它是多余的,但我这样做是为了方便。我还认为你上面提到的邻接列表对于索引
3
是错误的。它应该是
3.267
。你可以在这里可视化你的图形@risingStark谢谢。那是个错误。