如何在节点树中找到NodeData?

时间:2012-04-20 06:42:52

标签: c# oop

我有一个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);
              }
         }
     }
}

4 个答案:

答案 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;
            }
        }