我正在寻找一种算法,它沿着每个级别的最大节点值在树中找到路径。下图说明了问题:
如果某个级别上的所有节点都具有唯一值,则此问题将非常简单。但是,如果某个级别上存在重复值,那么我(假设我)需要某种前瞻性。如示例所示,如果存在绘制,则选择路径以允许下一级别中的更高值。采取“exterme”,路径
1 - > 2 - > 3 - > 4 - > 5 - > 6 - > 0
将在路径上选择
1 - > 2 - > 3 - > 4 - > 5 - > 5 - > 99
只要有一条可能的路径,算法就可以退出。
到目前为止,我天真的解决方案是找到所有可能的路径并逐级比较它们,这适用于我正在处理的(小)树,但我想找到一个“正确的”解决方案
我很确定这个算法已经实现了,但是,我发现很难找到合适的搜索条件。有人知道这个问题的解决方案吗?
答案 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 ;
}