【问题标题】:Check if node is (in)directly connected to a specific node检查节点是否(in)直接连接到特定节点
【发布时间】:2018-10-03 16:18:29
【问题描述】:

我希望能够检查特定节点是否直接或间接连接到根节点。下面的代码在一定程度上可以工作,但经常无法找到根(当它很明显应该找到时)。

编辑:本文中使用的词根不是任何保留术语,只是布尔变量的自发名称,它将节点标记为“特殊”。

到目前为止:

//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..
}

感谢任何帮助!

【问题讨论】:

  • 你的图是否包含循环,还是严格定向的?
  • 您的Nodestruct 而不是class 有什么原因吗?数组属性的存在已经暗示了一定程度的间接性(结构 references 数组)并向我表明您的选择可能会被误导。
  • 不确定它是否包含任何循环,很难尝试可视化流程。它实际上是一个类,但是在将代码缩减为仅相关的内容时,出于某种奇怪的原因,我将其更改为结构,很好!
  • 你能定义“根节点”吗?在我看来,因为您的节点只指孩子而不是父母,所以有向图中的根(据我理解的术语)将永远无法从其 connectedNodes 访问。
  • 在你的代码中你写了if (cNode.RootConnection),但是你的Node的类定义没有这样的属性。此外,您的输入变量是fromNode,但您的代码引用了其他一些名为FromNode 的变量。此外,Node 类中的字段默认为private,因此无法访问。您可能会考虑将它们设为公共属性。如果您发布可编译的代码,那就太好了。

标签: c# search nodes root path-finding


【解决方案1】:

我傻了,只检查了 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..
}

【讨论】:

    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多