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

原创 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);
               }
           }

 

QT之树形结构显示说明

一、Qt中QTreeView往往不是单一的树形结构,而是复杂的多级结构。现在以一个复杂的树形数据结构为例,说明QTreeView是怎么显示的。 二、数据结构如图所示: (1)虚线1号表示无效的根节...
  • houzijushi
  • houzijushi
  • 2018-01-14 18:18:45
  • 120

从数据库读取数据动态生成树形菜单示例

用C#从数据库读取数据,动态生成树形菜单例子 数据库表 前台代码 树形  body{background:#ecefff} .navPoint{COLOR:#666...
  • drr789
  • drr789
  • 2012-09-11 12:27:58
  • 39434

数据库索引和B-tree的联系

一、引言 数据库索引是什么样的?聚集索引与非聚集索引有什么不同?数据库索引使用最多的数据结构是什么? 二、B-Tree 我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree...
  • glx2012
  • glx2012
  • 2013-04-08 19:03:23
  • 1304

数据库中的树形结构 - JAVA 设计 (通用)

我们通常会在应用中碰到树形结构的内容,比如 文件夹/文件模型, 部门组织结构,目录树等等,通常在设...
  • subchen
  • subchen
  • 2007-10-09 13:53:00
  • 3792

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

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

目录树结构的数据库设计思考

昨天一同事遇到一问题,找我帮忙解决一下,自己对问题的一些思考
  • sinat_22657459
  • sinat_22657459
  • 2016-10-28 13:17:02
  • 2874

树形结构 数据库表设计

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

数据库为什么要用B+树结构-

B+树在数据库中的应用 { 为什么使用B+树?言简意赅,就是因为: 1.文件很大,不可能全部存储在内存中,故要存储到磁盘上 2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使...
  • bigtree_3721
  • bigtree_3721
  • 2017-06-13 00:26:01
  • 2790

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

树形结构的数据库表Schema设计     程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门、栏目结构、商品分类等等,通常而言,这些树状结构需要借助于数据...
  • zhaoxuejie
  • zhaoxuejie
  • 2016-09-22 15:03:30
  • 1146

树形结构的数据库

  • 2002年09月09日 00:00
  • 9KB
  • 下载
收藏助手
不良信息举报
您举报文章:从数据库中读出树形数据,并快速构建树型类关系
举报原因:
原因补充:

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