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

时间:2016-12-10 22:12:39

标签: algorithm data-structures tree tree-traversal

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

tree

如果某个级别上的所有节点都具有唯一值,则此问题将非常简单。但是,如果某个级别上存在重复值,那么我(假设我)需要某种前瞻性。如示例所示,如果存在绘制,则选择路径以允许下一级别中的更高值。采取“exterme”,路径

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

将在路径

上选择

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

只要有一条可能的路径,算法就可以退出。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 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 ;
}