Убедитесь, что узел (в) напрямую связан с конкретным узлом - PullRequest
0 голосов
/ 03 октября 2018

Я хотел бы иметь возможность проверить, подключен ли конкретный узел к корневому узлу напрямую или косвенно.Приведенный ниже код работает в некоторой степени, но довольно часто не удается найти корень (когда это очевидно, он должен).

РЕДАКТИРОВАТЬ: использование слова корня в этом посте не относится к каким-либо зарезервированным термином и являетсятолько спонтанное имя для логической переменной, которая помечает узел как «специальный».

Пока:

//The node
public class Node
{
    public Node[] connectedNodes;
    public bool rootNode;
}

//The function
public static bool HasRootNode(Node fromNode)
{
    List<Node> Processed = new List<Node>();
    Stack<Node> WorkStack = new Stack<Node>(FromNode.connectedNodes);

    Processed.Add(fromNode);

    while (WorkStack.Count != 0)
    {
        Node workItem = WorkStack.Pop();

        foreach (Node cNode in workItem.connectedNodes)
        {
            if (Processed.Contains(cNode))
                continue;

            if (cNode.rootNode)
                return true; // Found..

            WorkStack.Push(cNode); // Queue all of the connectedNodes for this node
            Processed.Add(cNode); // This node has been processed..
        }
    }

    return false; // Not found..
}

Оцените любую помощь!

1 Ответ

0 голосов
/ 03 октября 2018

Глупо, я проверил только подузлы workItem, но не сам узел workItem.:)

Спасибо за ваше время и внимание!

//The node
public class Node
{
    public Node[] connectedNodes;
    public bool rootNode;
}

//The function
public static bool HasRootNode(Node fromNode)
{
    List<Node> Processed = new List<Node>();
    Stack<Node> WorkStack = new Stack<Node>(FromNode.connectedNodes);

    Processed.Add(fromNode);

    while (WorkStack.Count != 0)
    {
        Node workItem = WorkStack.Pop();
        if (workItem.rootNode)
            return true; // Found..

        foreach (Node cNode in workItem.connectedNodes)
        {
            if (Processed.Contains(cNode))
                continue;

            if (cNode.rootNode)
                return true; // Found..

            WorkStack.Push(cNode); // Queue all of the connectedNodes for this node
            Processed.Add(cNode); // This node has been processed..
        }
    }

    return false; // Not found..
}
...