我有一个Node结构,如下所示,这个节点有stringdata和节点列表,因为它是子节点。我想在这棵树中搜索数据 我写了一个递归函数FindNode(Node intree,string target)
public class Node
{
public string Data;
public List<Node> Children = new List<Node>();
//some code
public Node(string r)
{
this.Data = r;
}
public string getData()
{
return this.Data;
}
//some code
public List<Node> getchildren()
{
return this.Children;
}
//some code
}
target是我想要查找的字符串,而intree是树的开头(ROOT) 我循环后遇到问题我应该在之后返回什么? 如果我错了,我应该怎么写呢?
public Node FindNode(Node intree,string target)
{
if(intree.getData()==target)
return intree;
else
{
while(intree.getchildren()!=null)
{
foreach(Node n in intree.getchildren())
{
FindNode(n,target);
}
}
}
}
答案 0 :(得分:2)
我建议你返回null并应用check来调用这个方法,如果返回null则表示没有找到节点。代码如下
public static Node FindNode(Node intree, string target)
{
if (intree.getData() == target)
return intree;
foreach (Node node in intree.getchildren())
{
Node toReturn = FindNode(node, target);
if (toReturn != null) return toReturn;
}
return null;
}
答案 1 :(得分:2)
使用这个:
public Node FindNode(Node intree,string target)
{
if(intree.getData()==target)
return intree;
else
{
foreach(Node n in intree.getchildren())
{
Node node = FindNode(n,target) ; //CHECK FOR RETURN
if(node != null)
return node;
}
}
return null;
}
不同之处在于我检查了FindNode
方法的返回,如果它不是null
,则返回结果。
请注意,如果树中存在重复节点(具有相同字符串的节点),它将返回第一个出现。
答案 2 :(得分:2)
鉴于树中可能有多个匹配项,您最好返回IEnumerable<Node>
。此外,您不需要将那些奇怪的get
方法放在那里。最后你的意思是只搜索叶子节点,还是想搜索所有节点(else语句)?
public IEnumerable<Node> FindNode(Node intree,string target)
{
if(intree.Data ==target)
yield return intree;
foreach (var node in intree.Children.SelectMany(c => FindNode(c, target))
yield return node;
}
如果您想要第一个匹配节点,只需在结果上调用First()
即可。如果您想确保只有一个,请在其上调用Single()
。
答案 3 :(得分:0)
public Node FindNodeRecursively(Node parentNode, string keyword)
{
if(parentNode.getData() == keyword)
{
return parentNode;
}
else
{
if(parentNode.Children != null)
{
foreach(var node in parentNode.Children)
{
var temp = FindNodeRecursively(node, keyword);
if(temp != null)
return temp;
}
}
return null;
}
}