Найти узел при обходе дерева

Я хочу реализовать метод, который позволит мне найти узел в дереве. Я делаю это рекурсивно, используя глобальные переменные, чтобы знать, когда остановиться.

У меня есть класс:

class Node    // represents a node in the tree
{ 
     // constructor
     public Node() {
          Children = new List<Node>();
     }

     public List<Node> Children; 
     public string Name;
     public string Content;            
}

И метод, который у меня сейчас есть:

    private bool IsNodeFound = false; // global variable that I use to decide when to stop

    // method to find a particular node in the tree
    private void Find(Node node, string stringToFind, Action<Node> foundNode)
    {
        if(IsNodeFound)
           return;

        if (node.Content.Contains(stringToFind)){
            foundNode(node); 
            IsNodeFound =true;               
        }

        foreach (var child in node.Children)
        {
            if (child.Content.Contains(stringToFind)){
                foundNode(node);
                IsNodeFound =true;               
            }

            Find(child, stringToFind, foundNode);
        }

    }

и то, как я использую метод Find, выглядит так:

   // root is a node that contain children and those children also contain children
   // root is the "root" of the tree
   IsNodeFound =false;
   Node nodeToFind = null;
   Find(root, "some string to look for", (x)=> nodeToFind=x);

Итак, мой вопрос как я могу сделать этот метод более элегантный. Мне бы хотелось, чтобы сигнатура метода выглядела так:

   public Node FindNode(Node rootNode);

Я думаю, что то, что я делаю, излишне, и, вероятно, есть лучший способ создать этот метод. Или, возможно, я мог бы изменить класс Node, чтобы добиться того же результата с помощью linq-запроса.

7
задан Tono Nam 22 June 2012 в 17:49
поделиться