遍历树中的所有叶节点C#

时间:2015-01-11 05:45:32

标签: c# data-structures

我正在尝试使用队列遍历树中的所有叶节点。 但我无法获得任何输出。

class MyNode<T>
{
    public T Data { get; set; }
    public MyNode<T> Parent { get; set; }
    public List<MyNode<T>> Children = new List<MyNode<T>>();
    public MyNode(T data, MyNode<T> parent)
    {
        Data = data;
        Parent = parent;
    }

    public override string ToString()
    {
        if (Children == null) return Data.ToString();
        return string.Format("{0} {1} ", Data.ToString(), Children.ToString());
    }

}

节点可以包含任意数量的子节点。以下是我编写的用于打印所有叶节点的内容。我无法得到任何东西,我认为只有最后一行Console.WriteLine(“”);被执行了,但我无法弄明白为什么。

    public static void PrintSentence(MyNode<string> root)
    {
        if (root == null)   // Return when the tree is empty.
            return;

        Queue<MyNode<string>> nodeQueue = new Queue<MyNode<string>>();
        nodeQueue.Enqueue(root);

        MyNode<string> currentNode = root;

        while (nodeQueue.Count != 0)
        {
            currentNode = nodeQueue.Peek();
            nodeQueue.Dequeue();

            if (currentNode.Children == null)   // Print strings only when the current node is a leaf node.
                Console.Write(currentNode.Data + " ");

            for (int i = 0; i < currentNode.Children.Count(); i++)
                nodeQueue.Enqueue(currentNode.Children[i]);
        }

        Console.WriteLine("");

    }

感谢您的帮助。 树类是这样的,实际上我无法在任何地方找到我的调试窗口...... 我只写了PrintSentence方法,其他的东西都是别人写的。

class Tree<T>
{
    public MyNode<T> Root { get; set; }
    public Tree(MyNode<T> root) { Root = root; }
    public override string ToString()
    {
        if (Root == null) return "";
        return Root.ToString();
    }
}

3 个答案:

答案 0 :(得分:3)

您需要替换此行

if (currentNode.Children == null)

用这个

if (currentNode.Children.Count == 0)

这将检查列表是否没有元素(没有子元素)。由于您始终初始化列表,因此即使它是空的,它也不会为空。

答案 1 :(得分:0)

单独的节点遍历和遍历操作如下:

我选择了递归,因为对树的重新调整通常不是问题,并且你不需要为queueu留下太多内存。

public static class MyNodeExt<T>
{
   IEnumerable<T> TraverseLeafs<T>(this MyNode<T> node)
   {
       if (node.Children.Count == 0)
           yield return node;
       else
       {
           foreach(var child in root.Children)
           {
               foreach(var subchild in child.TraverseLeafs())
               {
                   yield return subchild;
               }
           } 
       }
   }
}

单独的遍历行动:

public static void PrintSentence(MyNode<string> root)
{
    foreach(var node in root.TraverseLeafs())
    {
        Console.Write(node .Data + " ");
    }       
}

答案 2 :(得分:0)

通用解决方案:

public static class Hierarchy
{
    /// <summary>
    /// Gets the collection of leafs (items that have no children) from a hierarchical collection
    /// </summary>
    /// <typeparam name="T">The collection type</typeparam>
    /// <param name="source">The sourceitem of the collection</param>
    /// <param name="getChildren">A method that returns the children of an item</param>
    /// <returns>The collection of leafs</returns>
    public static IEnumerable<T> GetLeafs<T>(T source, Func<T, IEnumerable<T>> getChildren)
    {
        if (!getChildren(source).Any())
        {
            yield return source;
        }
        else
        {
            foreach (var child in getChildren(source))
            {
                foreach (var subchild in GetLeafs(child, getChildren))
                {
                    yield return subchild;
                }
            }
        }
    }
}

用法:

    var leafs = Hierarchy.GetLeafs(root, (element) => element.Children);
相关问题