对于树中的给定节点,我试图找到它的最高祖先(或节点本身),但不会跨越树中的某个“屏障”(特定的节点类型)--如果存在这样的“屏障”节点的话。如果没有“屏障”节点,我想返回树中的顶部节点。
听起来比实际情况更复杂--下面是一些代码:
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循环?
发布于 2019-05-16 03:00:38
完全摆脱它。
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;
发布于 2019-05-16 03:01:52
你可以使用递归
public Node GetTopNode(Node node)
{
var parent = GetParent(node);
return (parent != null && !IsBarrierNode(parent))
? GetTopNode(parent)
: node;
}发布于 2019-05-16 03:36:59
不修改原始节点的一种方法是创建一个引用该节点的新变量,然后在while(true)循环中“递增”该变量,该循环将该变量设置为有效的父节点:
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;
}
}https://stackoverflow.com/questions/56155908
复制相似问题