数据结构~树的遍历(Service层和UI层代码)

简介:

问题是这样的,Department表是一个部门表,由DeptId,name和Father组成,它是一种树型的关系,一个部门下可以有多个子部门,同时,它有一个父部门,祖宗部门没有父部门。

以下是测试数据(相当于Data层里取出数据的方法):

 static List<Department> deptList = new List<Department>
            {
                new Department(1,"根",0),
                new  Department(2,"计算机",1),
                new  Department(3,"英语",1),
                new  Department(4,"C语",2),
                new  Department(5,"VB",2),
                new  Department(6,"公共英语",3),
                new  Department(7,"大学英语",3),
                new  Department(8,"公一级",6),
                new  Department(9,"公二级",6),
                new  Department(10,"公三级",6),
                new  Department(11,"公四级",6),
            };
存放数据源的变量和为变量赋值的方法
 
#region 加载树,定义存放树的变量
        public static void LoadTree()
        {
            DepartmentTree = deptList;
        }
 
        public static List<Department> DepartmentTree = null;
#endregion
 
我们把加载树放在静态构造方法里,保存它只被加载一次就可以了,当然如果希望树自动更新,可以
看文章结尾处
 #region 当前类被第一次访问或类被第一次建立时间时加载树
        static Program()
        {
            LoadTree();
        }
 #endregion

以下是Service层,进行数据读取的方法:

        #region 树递归Service层
 
        /// <summary>
        /// 完整树
        /// </summary>
        /// <returns></returns>
        public static Department GetTree()
        {
            return GetTree(Department.RootId);
        }
 
        /// <summary>
        /// 找到指定ID的树
        /// </summary>
        /// <param name="deptId"></param>
        /// <returns></returns>
        public static Department GetTree(int deptId)
        {
            Department root = new Department();
            root = deptList.Where(i => i.DeptId.Equals(deptId)).SingleOrDefault();
            GetSublCategories(root);
            return root;
        }
 
        /// <summary>
        ///找到子孙树
        /// </summary>
        /// <param name="department">父对象</param>
        static public void GetSublCategories(Department department)
        {
            department.Sons = DepartmentTree.Where(item =>
                item.FatherId.Equals(department.DeptId) && item.DeptId != Department.RootId).ToList();
            department.Sons.ForEach(item =>
            {
                item.Father = department;
                GetSublCategories(item);
            });
 
        }
        #endregion

以下是UI层,将树型列表显示在屏幕上的代码:

#region 树递归UI层
        public string GetTreeHtml()
        {
            Department department = GetTree();
            StringBuilder html = new StringBuilder();
            html.Append("<ul id='containerul'>");
            this.GetSubCategory(html, department);
            html.Append("</ul>");
            return html.ToString();
        }
 
 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="html">HTML字条串组成树型列表</param>
        /// <param name="department">指定对象</param>
        private void GetSubCategory(StringBuilder html, Department department)
        {
            html.Append("<li id='" + department.DeptId + "'>");
            if (department.Sons != null && department.Sons.Count > 0)
            {
                html.Append("<a href='javascript:void(0)'>");
            }
            else
            {

html.Append("<a href='javascript:void(0)' onclick=\"showDCategoryTree('"

+ department.DeptId + "');\">");

            }
            html.Append("<ins>&nbsp;</ins>");
            html.Append(department.DeptId + "-" + department.Name);
            html.Append("</a>");
            if (department.Sons != null && department.Sons.Count > 0)
            {
                html.Append("<ul>");
                foreach (var item in department.Sons)
                {
                    this.GetSubCategory(html, item);
                }
                html.Append("</ul>");
            }
            html.Append("</li>");
        }
        #endregion

如果你的树(部门)前台显示时不会发生读写操作,可以把取数据方法写在静态构造方法里,就像这样:

 

#region 树递归UI层
        public string GetTreeHtml()
        {
            Department department = GetTree();
            StringBuilder html = new StringBuilder();
            html.Append("<ul id='containerul'>");
            this.GetSubCategory(html, department);
            html.Append("</ul>");
            return html.ToString();
        }
 
 
        /// <summary>
        /// 递归所有子树
        /// </summary>
        /// <param name="html">HTML字条串组成树型列表</param>
        /// <param name="department">指定对象</param>
        private void GetSubCategory(StringBuilder html, Department department)
        {
            html.Append("<li id='" + department.DeptId + "'>");
            if (department.Sons != null && department.Sons.Count > 0)
            {
                html.Append("<a href='javascript:void(0)'>");
            }
            else
            {

html.Append("<a href='javascript:void(0)' onclick=\"showDCategoryTree('"

+ department.DeptId + "');\">");

            }
            html.Append("<ins>&nbsp;</ins>");
            html.Append(department.DeptId + "-" + department.Name);
            html.Append("</a>");
            if (department.Sons != null && department.Sons.Count > 0)
            {
                html.Append("<ul>");
                foreach (var item in department.Sons)
                {
                    this.GetSubCategory(html, item);
                }
                html.Append("</ul>");
            }
            html.Append("</li>");
        }
        #endregion

OK,这种方法显示出来的树在不关闭浏览器或IIS不重启时,树如果被修改了,它也不会反映到树上的,如果希望改变这种情况,让数的修改实时显示出来,可以加一个事件。

#region 每隔1000毫秒去重新加载树
        static System.Timers.Timer sysTimer = new System.Timers.Timer(1000);
        static void sysTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            LoadTree();
        }
 #endregion

本文转自博客园张占岭(仓储大叔)的博客,原文链接:数据结构~树的遍历(Service层和UI层代码),如需转载请自行联系原博主。

目录
相关文章
|
13天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
56 16
|
23天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
26 1
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
18 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
29 0
|
1月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
28 0
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
24 0
|
14天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
5天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
14 1
|
8天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。