递归搜索类别及其子代

时间:2012-01-27 23:40:55

标签: c# recursion

我有以下课程:

public class Category {
    public string Name { get; set; }
    public Category Parent { get; set; }
    public string Url { get; set; }
    public List<Category> Children { get; set; }
}

现在给出一个Category和url的实例。我希望得到网址与类别或其中任何一个(或他们的孩子等)匹配的类别。

因此我的功能将具有以下签名:

public Category FindCategory(Category category, string url);

我知道递归是要走的路,我已经设法提出了解决方案。但是我肯定看到它做得更好但我找不到哪里。如果有人能告诉我最简单,最干净的方法,我会很感激。

由于

3 个答案:

答案 0 :(得分:3)

就递归而言,答案非常简单。我希望尝试模式超过null返回。

bool TryFind(string url, Category current, out Category found) {
  if (category.Url == url) {
    found = current;
    return true;
  }

  foreach (var child in current.Children) {
    if (TryFind(url, child, out found)) {
      return true;
    }
  }

  found = null;
  return false;
}

你的问题提到你看到它做得更好“。你能详细说明一下吗?我不太清楚你的意思。

答案 1 :(得分:1)

这是一个简单的递归算法:

public Category FindCategory(Category category, string url)
{
    if(category.Url == url)
    {
        return category;
    }

    Category solution = null;    

    foreach(Category child in category.Children)
    {
        solution = FindCategory(child, url);
        if(solution != null)
        {
            return solution;
        }
    }

    return null;
}

答案 2 :(得分:0)

我想你可以使用堆栈数据结构。类似的东西:

public Category FindCategory(Category category, string url) {
    Stack<Category> categoryStack = new Stack<Category>();
    categoryStack.Push(category);
    while(categoryStack.Peek() != null) {
        Category cat = categoryStack.Pop();
        if(cat.Url == url) {
            return cat;
        }

        foreach(Category child in cat.Children) {
            categoryStack.Push(child);
        }
    }

    return null;
}