C# 如何为与字符串一起使用的树结构建模

C# 如何为与字符串一起使用的树结构建模,c#,data-structures,tree,C#,Data Structures,Tree,我想制作一个树结构,它接受字符串并显示树中的所有内容。请注意,此处的目的不是创建二叉搜索树或任何与二叉树相关的内容,而是根据以下内容建模:输入的第一个字符串是“根”,第二个字符串是父节点,第三个字符串是父节点的子节点。请看插图。父节点的数量可以是多少 基本上,我想要一些关于如何处理这个问题的想法。我很熟悉二叉树的编码方式和工作原理,但这棵树的实现方式似乎大不相同。在您的例子中,它是一棵简单的树,由一组节点(多个子节点)组成,其中每个子节点都有一些相关联的数据和一组子节点。考虑到这一点,让我们创建

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


基本上,我想要一些关于如何处理这个问题的想法。我很熟悉二叉树的编码方式和工作原理,但这棵树的实现方式似乎大不相同。

在您的例子中,它是一棵简单的树,由一组节点(多个子节点)组成,其中每个子节点都有一些相关联的数据和一组子节点。考虑到这一点,让我们创建一个名为
节点的类型,它将充当树的构建块。并尝试将其抽象为可以通过继承扩展以满足树节点需要的基本节点类

注意:我将使它成为通用的,能够存储任何类型,尽管您希望存储“String”

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;
            }
        }
    }
}
最后,我们加入了我们讨论的所有内容

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;
        }
    }
}
公共类特殊树:节点
{
public SpecialTree():base(){}
公共特殊树(T数据):基(数据,null){}
公共专用树(T数据,左侧专用树,右侧专用树)
{
基本值=数据;
节点列表子节点=新节点列表(2);
儿童[0]=左;
儿童[1]=权利;
邻居=孩子;
}
公共专用树左
{
得到
{
if(base.neights==null)
返回null;
其他的
返回(SpecialTree)基。邻居[0];
}
设置
{
if(base.neights==null)
基本邻居=新节点列表(2);
base.neights[0]=值;
}
}
公共特殊权利
{
得到
{
if(base.neights==null)
返回null;
其他的
返回(SpecialTree)基。邻居[1];
}
设置
{
if(base.neights==null)
基本邻居=新节点列表(2);
基邻域[1]=值;
}
}
}

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

我建议您创建自己的类来表示二叉树。查看这些线程以了解更多详细信息


您所描述的是一个二叉树,这个二叉树的实现有什么不同?二叉树最多只能有两个子节点,这个二叉树可以有来自父节点的多个子节点。您能告诉我们您的代码不起作用吗?NodeList类是节点链表的另一个术语吗?我这样问是因为我不应该使用系统类以外的任何东西。另外,为什么继承?节点列表用于连接0..*子级。我使用collection,因为您可以抽象许多标准操作,例如Add(T)、Remove(T)和Clear()。当您从属于泛型集合命名空间的集合继承时,这些方法将自动可用。现在,如果您有任何限制,那么您可以删除Collection继承的依赖项,并在NodeList类中使用数组,并显式公开Add/remove/Clear(如果需要)等方法,这些方法基本上作用于数组。@KarimOumghar,只是想知道您对该解决方案有多满意。它有用吗?是的,我正在考虑这个想法,有很多方法来表示类似的东西,也可以使用类似的东西。
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;
        }
    }
}