Обход дерева объектов в c # - PullRequest
18 голосов
/ 14 января 2009

У меня есть дерево, состоящее из нескольких объектов, где у каждого объекта есть имя (строка), id (int) и, возможно, массив дочерних элементов одного типа. Как пройти через все дерево и распечатать все идентификаторы и имена?

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

Ответы [ 2 ]

42 голосов
/ 14 января 2009

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

printNode(Node node)
{
  printTitle(node.title)
  foreach (Node child in node.children)
  {
    printNode(child); //<-- recursive
  }
}

Вот версия, которая также отслеживает, насколько глубоко вложенная рекурсия (то есть, печатаем ли мы дочерние элементы корня, внуков, пра-внуков и т. Д.):

printRoot(Node node)
{
  printNode(node, 0);
}

printNode(Node node, int level)
{
  printTitle(node.title)
  foreach (Node child in node.children)
  {
    printNode(child, level + 1); //<-- recursive
  }
}
0 голосов
/ 14 января 2009

Ну, вы всегда можете использовать рекурсию, но в сценарии программирования "реального мира" это может привести к плохим вещам, если вы не будете следить за глубиной.

Вот пример, используемый для двоичного дерева: http://www.codeproject.com/KB/recipes/BinarySearchTree.aspx

Я бы связал Google связанные списки и другие древовидные структуры, если вы новичок во всей структуре данных. Существует множество знаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...