首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有更简洁的方法来找到树中满足条件的顶层节点?

有没有更简洁的方法来找到树中满足条件的顶层节点?
EN

Stack Overflow用户
提问于 2019-05-16 02:49:40
回答 3查看 45关注 0票数 0

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

听起来比实际情况更复杂--下面是一些代码:

代码语言:javascript
复制
    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循环?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-16 03:00:38

完全摆脱它。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-05-16 03:01:52

你可以使用递归

代码语言:javascript
复制
public Node GetTopNode(Node node)
{
    var parent = GetParent(node);
    return (parent != null && !IsBarrierNode(parent))
        ? GetTopNode(parent)
        : node;
}
票数 0
EN

Stack Overflow用户

发布于 2019-05-16 03:36:59

不修改原始节点的一种方法是创建一个引用该节点的新变量,然后在while(true)循环中“递增”该变量,该循环将该变量设置为有效的父节点:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56155908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档