C#实现树结构

   public class TreeNode : IEnumerable
    {
        public TreeNode()
        {
            Childs = new List<TreeNode>();
        }
        public TreeNode Parent { get; set; }
        public List<TreeNode> Childs { get; protected set; }

        public void AddChild(params TreeNode[] nodes)
        {
            for (int i = 0; i < nodes.Length; i++)
            {
                nodes[i].Parent = this;
                Childs.Add(nodes[i]);
            }
        }
        public void RemoveChild(params TreeNode[] nodes)
        {
            for (int i = 0; i < nodes.Length; i++)
            {
                nodes[i].Parent = null;
                Childs.Remove(nodes[i]);
            }
        }
        public List<TreeNode> GetBrothers()
        {
            if (this.Parent != null)
            {
                TreeNode[] childsOfPapa = new TreeNode[Parent.Childs.Count];
                this.Parent.Childs.CopyTo(childsOfPapa);
                List<TreeNode> childsOfPapaList = childsOfPapa.ToList();
                childsOfPapaList.Remove(this);
                return childsOfPapaList;
            }
            return null;
        }
        public IEnumerator GetEnumerator()
        {
            return new TreeEnum(this);
        }
    }
    class TreeEnum : IEnumerator
    {
        private TreeNode rootNode;
        private TreeNode curNode;
        Queue<TreeNode> collection;
        public TreeEnum(TreeNode _collection)
        {
            rootNode = _collection;

            collection = new Queue<TreeNode>();
            FillQueue(rootNode);
            curNode = rootNode;
        }

        private void FillQueue(TreeNode _collection)
        {
            //前序遍历
            collection.Enqueue(_collection);
            if (_collection.Childs != null && _collection.Childs.Count > 0)
                foreach (TreeNode child in _collection.Childs)
                {
                    FillQueue(child);
                }
        }

        public bool MoveNext()
        {
            if (collection.Count > 0)
            {
                curNode = collection.Dequeue();
                return true;
            }
            else
                return false;
        }

        public void Reset()
        {
            collection = new Queue<TreeNode>();
            FillQueue(rootNode);
            curNode = rootNode;
        }

        public TreeNode Current
        {
            get { return curNode; }
        }

        object IEnumerator.Current
        {
            get { return Current; }
        }

    }

这是一颗可以遍历的树~~~~用的是前序遍历

怎么用呢?

把你的类继承,带上附加信息就行。

就像这样

    public class FileNode: TreeNode
    {
        public string Name { get; set; }
    }

调用的时候就这样

        private void button1_Click(object sender, EventArgs e)
        {
            FileNode a1 = new FileNode() { Name = "1" };
            FileNode a2 = new FileNode() { Name = "2" };
            FileNode a3 = new FileNode() { Name = "3" };
            FileNode a4 = new FileNode() { Name = "4" };
            FileNode a5 = new FileNode() { Name = "5" };
            FileNode a6 = new FileNode() { Name = "6" };
            FileNode a7 = new FileNode() { Name = "7" };

            a1.AddChild(a2, a3);
            a2.AddChild(a4, a5);
            a3.AddChild(a6);
            a6.AddChild(a7);

            a3.RemoveChild(a6);

            textBox1.Text = string.Empty;
            foreach (FileNode node in a1)
            {
                textBox1.Text += node.Name;
            }
        }

有的同学要问了。不对劲啊,这个是treenode啊,不是tree啊。

可是可是。。。tree的每一个节点都可以带字节点,不都是可以看作一个tree吗?所以是一回事。。。

时间: 2024-10-29 07:32:20

C#实现树结构的相关文章

树结构在程序设计中的运用

                                                                                引言 近年来,由于各种竞赛纷纷采用free-pascal,因此对于算法来说,空间效率上的要求降低了,而对时间效率却提出了更高的要求.这使得选手不仅要娴熟地掌握常规算法,而且要大胆创新,构造更高效的算法来解决问题. 在以往的程序设计中,链式结构采用得较多.的确链式结构有编程复杂度低.简单易懂等优点,但有一个致命的弱点:相邻的两个元素间的联系

oracle分层查询中的start with和connect by(树结构查询)

来源:  http://blog.csdn.net/itmyhome1990/article/details/16338637 ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表中的数据还呈现出树型 结构的联系. 例如有如下案例: 数据为节选,字段值含义分别为税务机构代码.税务机构名称.上级税务机构代码,税务机构级别 select * from extern_dm_swjg查询的时候默认顺序就是上面的顺序,可以看出是混乱的并没有特殊结构特征. 而希望的结果如下图: sj_swj

第一章: 在RDB中的树结构数据

第一章: 在RDB中的树结构数据 在本章中,我将写一个基本的知识来理解这个问题 一  模型的作用 RBD处理树模型的作用总结为两点: 1  在RDB表中保存树的数据 2  效率的查询节点的相关节点 1  在RDB表中保存树的数据 我们可以定义的标准,该模型是否具有存储层次数据的功能 可以由保存的所有节点再现原有的层次结构 如果不能通过保存的数据再现原有的树结构,就不能说这个模型实现了树. 2  效率的查询节点的相关节点 通常,我们将数据保存到数据库中进行搜索,数据中保存了分层数据,可能会查询任何

用dfs序维护树结构

给定一棵n个节点的树,m次查询,每次查询需要求出某个节点深度为h的所有子节点. 对于这个问题如果试图去对每个节点保存所有深度的子节点,在数据大的时候内存会吃不消:或者每次查询的时候去遍历一遍,当数据大的时候,时间效率会非常低. 此时如果使用dfs序维护树结构就可以轻松地解决这个问题. 作为预处理,首先将将树的所有节点按深度保存起来,每个深度的所有节点用一个线性结构保存,每个深度的节点相对顺序要和前序遍历一致. 然后从树的根节点进行dfs,对于每个节点记录两个信息,一个是dfs进入该节点的时间戳i

索引深入浅出:非聚集索引的B树结构在聚集表

一个表只能有一个聚集索引,数据行以此聚集索引的顺序进行存储,一个表却能有多个非聚集索引.我们已经讨论了聚集索引的结构,这篇我们会看下非聚集索引结构. 非聚集索引的逻辑呈现 简单来说,非聚集索引是表的子集.当我们定义了一个非聚集索引时,SQL Server把整套非聚集索引键存在不同的页里.我们来看下一个包含BusinessEntityID(PK),PersonType,FirstName,LastName这4列的表,这个表上有一个非聚集索引定义.主体表按BusinessEntityID列(聚集索引

一行python代码实现树结构

树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用.一颗树可以简单的表示为根, 左子树, 右子树. 而左子树和右子树又可以有自己的子树.这似乎是一种比较复杂的数据结构,那么真的能像我们在标题中所说的那样,用一行Python代码就可以实现吗? 一行代码实现? 由于树形结构的外层和内层有着相似的结构,所以多可以用递归的方式定义树.再利用Python中提供的defaultdict,我们就可以很轻松地定义树了,而且只有一行代码. from collections import defaultd

asp.net mvc+EF 递归生成树结构返回json

0.数据表结构,主要属性有:Id.parentId(父节Id).Text.Url……等等. 1.新建一个树结构MenuModels 1 public class MenuModels 2 { 3 private int _id; 4 private string _text; 5 private int? _parentid; 6 private string _icon; 7 private string _url; 8 private object _menus; 9 private Dic

react+redux教程(五)异步、单一state树结构、componentWillReceiveProps

教程目录 react+redux教程(一)connect.applyMiddleware.thunk.webpackHotMiddleware react+redux教程(二)redux的单一状态树完全替代了react的状态机? react+redux教程(三)reduce().filter().map().some().every()....展开属性 react+redux教程(四)undo.devtools.router react+redux教程(五)异步.单一state树结构.compo

Android应用源代码ListView实现的文件夹树结构

Android应用源代码ListView实现的文件夹树结构 点击加号能够展开,点击减号能够收起这一个节点 源代码下载地址:http://download.csdn.net/detail/kiduo08/7711711

数据结构编程实验——chapter8-采用树结构的非线性表编程

关于树结构的非线性表编程在数据结构中可以说占据了半壁江山,其中涉及的知识点繁杂,但也是数据结构体现运算优化的核心所在,下面我们将较为初步且系统得讨论数据结构中一系列有关树的表示. 首先我们再次明确树的形式化概念: 树是n个节点的有限集合,这个集合满足以下的条件: 1)     有且仅有一个节点没有前件. 2)     除根外,其他的所有节点都有且仅有一个前件. 3)     除去根以外,其他每个节点都通过唯一的路径连接根上.每个节点的前件称为该节点的父节点,后件称为该节点的子节点. 这篇文章主要