沿着每个级别的最大节点值在树中查找路径的算法

问题描述 投票:0回答:2

我正在寻找一种算法,可以沿着每个级别的最大节点值在树中找到一条路径。下图说明了这个问题:

tree

如果一个级别上的所有节点都有唯一值,那么这个问题就很简单了。但是,如果某个级别上存在重复值,那么我(假设我)需要某种前瞻性。如示例所示,如果出现平局,则选择允许在下一级别中获得更高值的路径。走向“极端”,路径

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 0

将在路径上选择

1 -> 2 -> 3 -> 4 -> 5 -> 5 -> 99

一旦只有一条可能的路径,算法可能会退出。

到目前为止,我天真的解决方案是找到所有可能的路径,然后逐级比较它们,这适用于我正在处理的(小)树,但我想找到一个“正确的”解决方案。

我很确定这个算法已经被实现了,但是,我发现很难找到适合它的搜索词。有谁知道这个问题的解决方案吗?

algorithm data-structures tree tree-traversal
2个回答
1
投票

您可以从根开始并维护候选人列表。最初,根是列表中的唯一元素。在每次迭代中,您可以查看当前候选的所有子级,并将具有最大值的子级放入新的候选列表中(即,每次迭代都会降低一级)。

每个节点最多被访问一次,因此该解决方案具有线性时间复杂度。


1
投票

这是一个可能的实现(未经测试)

假设基于节点的树结构如下:

internal class Node
{
  int Value ;
  List<Node> Children ;
}

主要程序

// Initialize the best path and call the Seek procedure
List<Node> BestPath = SeekBestSubPath(TheRootNode) 

递归函数

private List<Node> SeekBestSubPath(Node CurrentNode)
{
  // identify one or more children with max value   
  List<Node> BestChildrenNodes = null ;
  int Max = int.MinValue ;
  for (int i=0;i<CurrentNode.Children.Count;i++)
    if (CurrentNode.Children[i].Value > Max) 
      BestChildrenNodes=new List<Node>() { CurrentNode.Children[i] } ;
    else if (CurrentNode.Children[i].Value == Max)
      BestChildrenNodes.Add(CurrentNode.Children[i]) ;

  // Process BestChildrenNodes
  List<Nodes> result = new List<Node>() ;
  for (int i=0;i<BestChildrenNodes.Count;i++)
  { // search the best sub path for each child and keep the best one among all  
    List<Node> ChildBestSubPath = SeekBestSubPath(BestChildrenNodes[i]) ;
    if (PathComparator(ChildBestSubPath,MaxPath)>1) result=ChildBestSubPath ;
  }
  result.Insert(0,CurrentNode) ;
  return result ;
}

比较 2 个子路径

private PathComparator(List<Node> Path1,List<Node> Path2)
{ returns 0:equality, 1:Path1>Path2, -1:Path1<Path2
  int result = 0
  for (int i=0;i<Math.Min(Path1.Length,Path2.length) && result=0;i++)
     result=Math.Sign((Path1[i].Value).CompareTo(Path2[i].Value));
  if (result==0) result=Math.Sign(((Path1[i].Count).CompareTo(Path2[i].Count)); 
  return result ;
}
© www.soinside.com 2019 - 2024. All rights reserved.