从数据库中读出树形数据,并快速构建树型类关系

原创 2007年10月11日 09:05:00

            在软件开发中经常用到树形的数据结构(如:物品分类),一般数据库设计人员都采用三列(id,upid,name)表存储数据,对于大型的树,如何把从数据库中读出的数据快速构建成内存中的树型类(如:TreeNode 关系),一定要仔细考虑算法的设计以提高效率。

            本文在.net 2.0环境下使用 C#语言, 用单次循环加一递归过程实现了快速构建TreeNode关系。

           代码如下:

           /// <summary>
           /// 从数据库中读出分类数据并构建TreeNode树
           /// </summary>
           /// <returns>根TreeNode实例</returns>
           public static TreeNode GetFenLeiTree()
           {
               SortedDictionary<string, TreeNode> flList = GetTreeNodeList();
               SortedDictionary<string, TreeNode> AddedList = new SortedDictionary<string, TreeNode>();
               TreeNode rootNode = new TreeNode(MyConfig.FenLeiRootName);
               rootNode.Name = "-1";
               foreach (TreeNode fli in flList.Values)
               {
                   AddNodeToTree(rootNode, fli, flList, AddedList);
               }
               return rootNode;
           }

           /// <summary>
           /// 从数据库中读出数据并返回按ID排序的TreeNode集合
           /// </summary>
           /// <returns>按ID排序的TreeNode集合</returns>
           private static SortedDictionary<string, TreeNode> GetTreeNodeList()
           {
               SortedDictionary<string, TreeNode> tnList = new SortedDictionary<string, TreeNode>();
               TreeNode tn;
               string sql = "select id,upid,name from tfenlei";
               IDataReader idr = ChaoShiDB.DM.ExecuteReader(sql);
               try
               {
                   while (idr.Read())
                   {
                       tn = new TreeNode();
                       tn.Name = idr[0].ToString();
                       tn.Text = idr[2].ToString();
                       if (!(idr[1] is DBNull))
                           tn.Tag = idr[1].ToString();
                       tnList.Add(tn.Name, tn);
                   }
               }
               finally
               {
                   idr.Close();
               }
               return tnList;
           }

           /// <summary>
           /// 递归过程,将给定的TreeNode加入节点树.
           /// </summary>
           /// <param name="root">根节点TreeNode</param>
           /// <param name="tn">要加入节点树的TreeNode</param>
           /// <param name="tnList">所有节点,按ID排序的TreeNode集合</param>
           /// <param name="addedList">已加入节点树的节点,按ID排序的TreeNode集合</param>
           private static void AddNodeToTree(TreeNode rootNode, TreeNode tn,
               SortedDictionary<string, TreeNode> tnList,
               SortedDictionary<string, TreeNode> addedList)
           {
               if (addedList.ContainsKey(tn.Name))
                   return;

               TreeNode uptn;
               if (tn.Tag == null)
               {
                   rootNode.Nodes.Add(tn);
                   addedList.Add(tn.Name, tn);
               }
               else
               {
                   if (!addedList.ContainsKey(tn.Name.ToString()))
                   {
                       AddNodeToTree(rootNode, tnList[tn.Tag.ToString()], tnList, addedList);
                   }
                   uptn = addedList[tn.Tag.ToString()];
                   uptn.Nodes.Add(tn);
                   addedList.Add(tn.Name, tn);
               }
           }

 

树形结构的数据库

  • 2002年09月09日 00:00
  • 9KB
  • 下载

树形数据在关系数据库的存储

树形数据在关系数据库中的存储同对象一样,都会遇到一个"阻抗不匹配"的问题。如何设计一个表结构,才能较好的满足需求呢?事实上,有很多解决方案,但是没有哪一种是放之四海而皆准的。我个人认为解决方案的选择,...
  • cassaba
  • cassaba
  • 2014年03月25日 15:34
  • 3325

树形结构的数据如何保存到关系型的数据库

需求: 文档型数据,结构是树形的,如图: 想要读取生成树形结构、添加子节点、查找修改数据的代价最小。 看知乎上牛人的答案: 一般比较普遍的就是四种方法:(具体见 SQL Ant...
  • jim8757
  • jim8757
  • 2016年08月31日 15:41
  • 3565

如何将数据库中存的树转化为树形列表(以easyui的tree为例)

很多时候,我们会把一棵树存放到数据库中,当前台需要展示一个树形列表时,将这棵树读取出来并显示,这个过程是怎么实现的呢? 这篇文章是以构造一棵easyui前台框架的一个树形列表为例,后台框架是spri...
  • u012116457
  • u012116457
  • 2015年05月22日 09:20
  • 10151

java构建树,构建tree,组装树结构,通用算法,用到递归算法

java利用递归算法,map和list对树进行组装。
  • heliangb46
  • heliangb46
  • 2017年06月10日 09:09
  • 1712

树形结构_数据库_利用递归遍历一棵只知道父节点的树

今天头提了一个需求,要求 求一棵只知道父节点的树下有多少叶子节点,叶子节点有可能挂在中间节点上。 (怕说的不明确:求一个部门下的所有人,部门下可能有子部门,一级部门下有人,二级部门下也可能有人。...
  • Sky786905664
  • Sky786905664
  • 2016年09月27日 11:12
  • 941

树形结构 数据库表设计

转载:逻辑数据库设计 - 单纯的树(递归关系数据) 相信有过开发经验的朋友都曾碰到过这样一个需求。假设你正在为一个新闻网站开发一个评论功能,读者可以评论原文甚至相互回复。   这个需求并不...
  • tiantiandjava
  • tiantiandjava
  • 2015年04月30日 09:46
  • 34077

使用递归算法结合数据库解析成java树形结构

感谢有奉献精神的人 转自:http://blog.sina.com.cn/s/blog_5d911a3f0102v0ue.html 使用递归算法结合数据库解析成...
  • zhangliao613
  • zhangliao613
  • 2015年08月31日 17:47
  • 1733

常见数据库设计 — 树形结构数据

1 概述 树形数据,主要关注的是: 1> 如何将数据高效地以树形的形式展现给用户 2> 通过某个节点找到所有的父节点。 3> 获取某个节点的所有的后继节点(包括子节点的子节点) 至于添加、修改、删除和...
  • hljlzc2007
  • hljlzc2007
  • 2013年12月12日 15:43
  • 1481

树形结构的数据库表Schema设计

树形结构的数据库表Schema设计     程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门、栏目结构、商品分类等等,通常而言,这些树状结构需要借助于数据...
  • zhaoxuejie
  • zhaoxuejie
  • 2016年09月22日 15:03
  • 619
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从数据库中读出树形数据,并快速构建树型类关系
举报原因:
原因补充:

(最多只允许输入30个字)