-1

我想创建一个树结构,它接收字符串并显示树中的所有内容。请注意,这里的目的不是制作二叉搜索树或任何与二叉树相关的东西,而是根据以下基础建模:输入的第一个字符串是“根”,第二个字符串是父字符串,以及第三个是父节点的子节点。请看插图。然而,父节点的数量可以很多。

基本上,我想要一些关于如何解决这个问题的想法。我熟悉二叉树的编码方式及其工作原理,但这个实现起来似乎有很大的不同。在此处输入图像描述

4

2 回答 2

1

在您的情况下,它是一个由节点集合(多个子节点)组成的简单树,其中每个子节点都有一些关联数据和一组子节点。考虑到这一点,让我们有一个名为的类型Node,它将充当我们树的构建块。并尝试抽象出来作为基础Node类,通过继承可以扩展以满足树节点的需求。

注意:尽管您想存储“字符串”,但我将使其通用以能够存储任何类型。

public class Node<T>
{
        // Private member-variables
        private T data;//This member variable contains the data stored in the node of the type specified by the developer using this class.

        private NodeList<T> neighbors = null; //of type `NodeList<T>`. This member variable represents the node's children.

        public Node() {}
        public Node(T data) : this(data, null) {}
        public Node(T data, NodeList<T> neighbors)
        {
            this.data = data;
            this.neighbors = neighbors;
        }

        public T Value
        {
            get
            {
                return data;
            }
            set
            {
                data = value;
            }
        }

        protected NodeList<T> Neighbors
        {
            get
            {
                return neighbors;
            }
            set
            {
                neighbors = value;
            }
        }
    }
}

该类NodeList包含Node<T>实例的强类型集合。该类派生自Collection<T>以具有强类型集合,具有诸如 等方法Add(T), Remove(T)Clear()这里要注意的重要一点是,任意('n')数字可以通过在集合中创建指定数量的节点的构造函数以及在集合中搜索具有特定值的元素的方法来添加节点数。

public class NodeList<T> : Collection<Node<T>>
{
    public NodeList() : base() { }

    public NodeList(int initialSize)
    {
        // Add the specified number of items
        for (int i = 0; i < initialSize; i++)
            base.Items.Add(default(Node<T>));
    }

    public Node<T> FindByValue(T value)
    {
        // search the list for the value
        foreach (Node<T> node in Items)
            if (node.Value.Equals(value))
                return node;

        // if we reached here, we didn't find a matching node
        return null;
    }
}

最后,我们加入了我们讨论的所有内容。

public class SpecialTree<T> : Node<T>
{
    public SpecialTree() : base() {}
    public SpecialTree(T data) : base(data, null) {}
    public SpecialTree(T data, SpecialTree<T> left, SpecialTree<T> right)
    {
        base.Value = data;
        NodeList<T> children = new NodeList<T>(2);
        children[0] = left;
        children[1] = right;

        base.Neighbors = children;
    }

    public SpecialTree<T> Left
    {
        get
        {
            if (base.Neighbors == null)
                return null;
            else
                return (SpecialTree<T>) base.Neighbors[0];
        }
        set
        {
            if (base.Neighbors == null)
                base.Neighbors = new NodeList<T>(2);

            base.Neighbors[0] = value;
        }
    }

    public SpecialTree<T> Right
    {
        get
        {
            if (base.Neighbors == null)
                return null;
            else
                return (SpecialTree<T>) base.Neighbors[1];
        }
        set
        {
            if (base.Neighbors == null)
                base.Neighbors = new NodeList<T>(2);

            base.Neighbors[1] = value;
        }
    }
}
于 2013-05-31T05:53:56.393 回答
0

.NET 中没有用于操作树结构的内置类,原因很简单,因为变化太多。

我建议您制作自己的代表二叉树的类。查看这些线程以获取更多详细信息。

为什么 .NET 中没有 Tree<T> 类?

C#中的树数据结构

于 2013-05-31T08:47:06.097 回答