获取数组中两个项之间的路径

时间:2015-01-24 08:50:48

标签: c# arrays algorithm tree

我正在尝试编写一个函数来获取数组中两个项之间的路径 此数组表示项目之间的连接 就像没有周期的树一样:

 A=[1, 3, 0, 3, 2] 
 A[0]=1 // node 0 is connected to node 1
 A[1]=3 // node 1 is connected to node 3
 A[2]=0 //node 2 is connected to node 0

等等, 所以现在这个数组会生成一个这样的图<4---2---0----1---3> 并且此函数应该获取数组中两个给定的indecies之间的路径 如果给4&amp; 1输出应该是[2,0]

的列表

所以我想帮助如何开始为这个函数构建算法?

我试过这段代码

    private List<int> getDirectlyConnectedNodes(int ind, int[] A)
        {

            List<int> directNeighbours = new List<int>();
            for (int i = 0; i < A.Length; i++)
            {
                if ((A[i] == ind || A[ind] == i) && ind != i)
                {
                    directNeighbours.Add(i);
                }
            }
            return directNeighbours;
        }
        private List<int> getPath(int ind1, int ind2, int[] A, List<int> path)
        {

            List<int> directNeighbours= getDirectlyConnectedNodes(ind1, A);


            foreach (int i in directNeighbours)
            { 
                path.Add(i);
                if (A[i] == ind2 || A[ind2] == i)
                {

                    return path; 
                }
                else
                {
                    getPath(i, ind2, A, path);  
                }

            }

            return path; 
        }

2 个答案:

答案 0 :(得分:0)

您可以从两个节点找到root用户的路径,删除公共部分和连接路径。

public static List<int> GetPath(int a,int b,int[] array) {
    Stack<int> stacka=GetPathToRoot(a,array);
    Stack<int> stackb=GetPathToRoot(b,array);
    int lastCommonNode=-1;
    while(stacka.Count>0&&stackb.Count>0&&stacka.Peek()==stackb.Peek()) {
        lastCommonNode=stacka.Pop();
        stackb.Pop();
    }
    List<int> list=new List<int>();
    while(stacka.Count>1) {
        list.Add(stacka.Pop());
    }
    list.Reverse();
    if(stacka.Count>0&&stackb.Count>0) {
        list.Add(lastCommonNode);
    }
    while(stackb.Count>1) {
        list.Add(stackb.Pop());
    }
    return list;
}
private static Stack<int> GetPathToRoot(int a,int[] array) {
    Stack<int> stack=new Stack<int>();
    for(;;) {
        stack.Push(a);
        if(array[a]==a) {
            break;
        }
        a=array[a];
    }
    return stack;
}

答案 1 :(得分:0)

难道你不能从第一个索引开始并一直持续到第二个索引为止?在您的数据结构中似乎没有任何分支,只是从一个节点到下一个节点的固定路径。

private IEnumerable<int> getPath(int ind1, int ind2, int[] A)
{    
    for (int ind = ind1; A[ind] != ind && A[ind] != ind2; ind = A[ind])
    {
        yield return A[ind];
    }
}

如果指定的节点之间没有路径,您可能需要调整它以覆盖您得到的误报,但是当有路径时它应该找到它。