给定一棵树(按树,我的意思是N节点,N-1边缘并连接)树的根被改为让我们说 r 。现在给另一个节点让我们说 t ,你必须找到以 t 为根的子树中所有节点的总和。 我试图用c ++实现它。
std::map<int, std::vector< pair<int,int> > > map;
如果我遍历矢量图[t],我必须确保它不会进入导致 r 的路径。我该如何确保? 还有一种更好的方法来存储树在c ++中,考虑到树的根可能会改变的条件吗?我认为会有因为地图没有传达关于根的任何信息。 :)
答案 0 :(得分:3)
问题是您将树存储为常规图形。因此,对于给定的顶点,您不知道哪个是通向根的弧(即父节点)。
解决方案在很大程度上取决于上下文。一个简单的解决方案是从r开始并寻找t的深度优先搜索。一旦发现你也找到了t的父级,你就可以很容易地从t开始识别子树。
或者你可以从t开始寻找r。当你找到r时,你找到了t的父级,你可以遍历所有其他弧来找到t的子树。
关于图的替代表示,通常最好保留顶点列表,并为每个顶点保留一个邻居顶点列表,如:
std::map<int, std::list<int> >