在C#中查找节点的深度

时间:2010-11-17 22:34:35

标签: c# algorithm binary-tree

我有一个未分类的对象列表。这些对象代表二叉树。

对象列表:

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 个答案:

答案 0 :(得分:4)

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 :(得分:1)

您可以将对象添加到字典中,使用左右值作为键,将Id作为值(基本上是反向映射)。那么你就像这样编写你的递归函数......

Dictionary<int, int> map;
    int depth(int node)
    {
        if (!map.ContainsKey(node))
            return 0;
        return depth(map[node]) + 1;
    }

答案 2 :(得分:0)

你可以制作一个Dictionary<int,int> parents。将节点ID存储为键,将节点的父节点存储为值。请注意,这意味着在字典中为原始列表中的每个对象存储零个,一个或两个记录。然后,要查找节点的深度,只需计算在用完之前可以获取父节点的次数。像这样:

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