我想按排序顺序获取所有子树的节点列表(即,我希望为每个子树维护一个数组,以按排序顺序存储该子树中的所有节点)
目前我的方法是:-
struct Node
{
vector<int> v;
};
void Merge(vector<int> v1,vector<int> v2,vector<int> &v)
{
int n=v1.size(),m=v2.size(),i=0,j=0;
while(i<n && j<m)
{
if( v1[i] < v2[j] )
v.push_back( v1[i++] );
else v.push_back( v2[j++] );
}
while( i < n )
v.push_back( v1[i++] );
while( j < m )
v.push_back( v2[j++] );
}
void build(Node tree[],vector<int> adj[],int root,int parent,int n)
{
vector<int> v1,v2;
v1.reserve(n),v2.reserve(n);
for(int i=0; i<adj[root].size(); i++)
{
if(adj[root][i]!=parent)
{
build(tree,adj,w,adj[root][i],root,n);
Merge(tree[adj[root][i]].v,v1,v2);
v1.clear();
v1=v2;
v2.clear();
}
}
v2.push_back(root);
Merge(v2,v1,tree[root].v);
}
在这里,我正在使用子节点的排序数组并合并它们,以获取父节点的排序列表(有点像合并排序)。这对于高度较小的树似乎可以正常工作,但对于稀疏树(高度为N的顺序),最多需要O(N ^ 2)。
此外,我想将节点保持在线性数据结构(数组,向量等)中,以便可以轻松应用各种操作。
有更好的方法吗?