获得所有子树节点排序列表的有效方法

时间:2019-04-14 08:16:33

标签: sorting graph tree

我想按排序顺序获取所有子树的节点列表(即,我希望为每个子树维护一个数组,以按排序顺序存储该子树中的所有节点)

目前我的方法是:-

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)。

此外,我想将节点保持在线性数据结构(数组,向量等)中,以便可以轻松应用各种操作。

有更好的方法吗?

0 个答案:

没有答案