Найти глубину узла в C # - PullRequest
       2

Найти глубину узла в C #

2 голосов
/ 18 ноября 2010

У меня есть список несортированных объектов.Эти объекты представляют двоичное дерево.

Список объектов:

new List<Object> 
{
    new { Id = 3, Left = /, Right = / }
    new { Id = 5, Left = /, Right = / }
    new { Id = 4, Left = 2, Right = 5 }
    new { Id = 2, Left = 1, Right = 3 }
    new { Id = 1, Left = /, Right = / }
}

Двоичное дерево:

      4
    /  \
   2    5
  / \
 1  3

Мне нужен алгоритм, который найдет глубину любого изэти узлы.Единственный известный мне алгоритм - поиск в глубину.Это означает, что я должен преобразовать список объектов в дерево.Учитывая, что .NET не имеет явной древовидной структуры данных, как бы вы подошли к этой проблеме?Нужно ли преобразовывать структуру данных в дерево (я не очень хочу писать весь код).Есть ли другой алгоритм?

Ответы [ 3 ]

4 голосов
/ 18 ноября 2010
int nodeToFind = 2;
var currentNode = list.Single(n => n.Id == nodeToFind);
int depth = 0;
while ((currentNode = list
    .FirstOrDefault(i => i.Left == currentNode.Id || i.Right == currentNode.Id)) != null)

    depth++;
Console.WriteLine(depth);

Простой, но неэффективный.

1 голос
/ 18 ноября 2010

Вы можете просто добавить свои объекты в словарь, используя каждое из левого и правого значений в качестве ключей и Id в качестве значения (в основном, обратная карта).затем вы пишете свою рекурсивную функцию следующим образом ...

Dictionary<int, int> map;
    int depth(int node)
    {
        if (!map.ContainsKey(node))
            return 0;
        return depth(map[node]) + 1;
    }
0 голосов
/ 18 ноября 2010

Вы можете просто сделать Dictionary<int,int> parents.Сохраните идентификатор узла в качестве ключа и родительский узел в качестве значения.Обратите внимание, что это означает сохранение нуля, одной или двух записей в словаре для каждого объекта в исходном списке.Затем, чтобы найти глубину узла, просто посчитайте, сколько раз вы можете получить родительский узел, прежде чем закончится.Как то так:

public static int NodeDepth(int node, Dictionary<int,int> parents)
{
     int depth = 0;
     while (parents.ContainsKey(node))
     {
          node = parents[node];
          depth++;
     }
     return depth;
}
...