有没有更简洁的方法来找到树中符合条件的顶部节点

时间:2019-05-15 18:49:40

标签: c# tree traversal tree-traversal

对于树中的给定节点,我试图找到其最高祖先(或节点本身),但没有越过树中的“障碍”(特定节点类型)-如果存在这样的“屏障”节点。如果没有“障碍”节点,我想返回树中的顶部节点。

听起来比现在还复杂-这是一些代码:

    public Node GetHighestRelevantAncestorOrSelf(Node node)
    {
        Node topNode = node;
        bool newTopNodeFound;
        do
        {
            Node newTopNode = GetParent(topNode);

            newTopNodeFound = (newTopNode != null && !IsBarrierNode(newTopNode));

            if (newTopNodeFound)
            {
                topNode = newTopNode;
            }
        } while (newTopNodeFound);

        return topNode;
    }

是否有更好的方式编写此代码,即无需两次评估“ newTopNodeFound”?也许使用for循环?

3 个答案:

答案 0 :(得分:1)

完全摆脱它。

public Node GetHighestRelevantAncestorOrSelf(Node node)
{
    Node topNode = null;
    while(node != null && !IsBarrierNode(node))
        node = GetParent(topNode = node);
    return topNode;
}

尽管此功能与您所拥有的功能略有不同。如果您传入的node是一个障碍节点,那么您将返回该节点,而这将返回null。如果您要更改它,请将行Node topNode = null;修改为Node topNode = node;

答案 1 :(得分:0)

您可以使用递归

public Node GetTopNode(Node node)
{
    var parent = GetParent(node);
    return (parent != null && !IsBarrierNode(parent))
        ? GetTopNode(parent)
        : node;
}

答案 2 :(得分:0)

在不修改原始节点的情况下执行此操作的一种方法是创建一个引用它的新变量,然后在while(true)循环中“递增”该变量,如果有效,则将其设置为父节点:< / p>

public Node GetHighestRelevantAncestorOrSelf(Node node)
{
    Node result = node;

    while (true)
    {
        Node parent = GetParent(result);
        if (parent == null || IsBarrierNode(parent)) return result; // This exits the loop
        result = parent;
    }
}