C#递归树实现实例简析

开发 后端
C#递归树实现实例主要向你介绍了通过递归算法的使用来实现数据库数据的两种具体的实现方法,那么本问就向你介绍具体的实现过程。

C#递归树实现实例是如何办到的呢?这里我们使用递归来实现对于数据的树形结构的呈现,那么关于递归的方向我们向你介绍两个,一个是从父节点出发,一个是反向的实现,让我们看看具体的实现步骤吧:

C#递归树实现实例:从父结点加字节点,注释的是把字节点向父结点上加

  1. //将数据填充到dataTable  
  2. DataTable mytable = new DataTable();  
  3. //构建表结构  
  4. DataRow myRow;  
  5. DataColumn Id = new DataColumn("Id"typeof(System.Int32));  
  6. mytable.Columns.Add(Id);  
  7. DataColumn Name = new DataColumn("Name"typeof(System.String));  
  8. mytable.Columns.Add(Name);  
  9. DataColumn ParentId = new DataColumn("ParentId"typeof(System.Int32));  
  10. mytable.Columns.Add(ParentId);  
  11. DataColumn SiteInfo = new DataColumn("SiteInfo"typeof(SiteInfo));  
  12. mytable.Columns.Add(SiteInfo);  
  13. //填充数据  
  14. //注意i是从1开始的,因为数据库收条没有意义,  
  15. //数据库首条记录id为0,会引起死循环  
  16. for (int i = 1; i <= cata.Length - 1; i++)  
  17. {  
  18.  myRow = mytable.NewRow();  
  19.  myRow["Id"] = cata[i].Id;  
  20.  myRow["Name"] = cata[i].Name;  
  21.  myRow["ParentId"] = cata[i].ParentId;  
  22.  myRow["SiteInfo"] = cata[i].SiteInfo;  
  23.  
  24.  mytable.Rows.Add(myRow);  
  25. }  
  26.  
  27.  
  28. this.InitTree(newNode.ChildNodes, 0, mytable);  
  29.     
  30.  
  31. //Hashtable ht = new Hashtable();  
  32.  
  33. //for (int i = 1; i < cata.Length; i++)  
  34. //{  
  35. // ht.Add(cata[i].Id, cata[i]);  
  36. //}  
  37.  
  38.  
  39. //Hashtable allTreeNodes = new Hashtable();  
  40. //Hashtable parentNodes = new Hashtable();  
  41. ////遍历树节点描述并拟向生成树结构  
  42. //foreach (DictionaryEntry dict in ht)  
  43. //{  
  44. // CatalogInfo treeobj = (CatalogInfo)dict.Value;  
  45. // if (allTreeNodes.Contains(treeobj.Id))  
  46. //  continue;  
  47. // TreeNode tn = new TreeNode();  
  48. // tn.Text = treeobj.Name;  
  49. // tn.Value = treeobj.Id.ToString();  
  50. // tn.NavigateUrl = "main_right.aspx?catalogid=" + tn.Value;  
  51. // tn.Target = "WorkArea";  
  52. // generateParentTreeFromNode(  
  53. tn, (CatalogInfo)treeobj, ht, parentNodes, allTreeNodes);  
  54. //}  
  55.  
  56. ////将所有根节点放到treeview上  
  57. //foreach (DictionaryEntry dict in parentNodes)  
  58. //{  
  59. // newNode.ChildNodes.Add((TreeNode)dict.Value);  
  60. //}  
  61.   }  
  62. }  
  63.  private void InitTree(TreeNodeCollection Nds,   
  64. int parentID, DataTable dt)//递归初始化树  
  65.  {  
  66.   TreeNode tmpNd;  
  67.   //递归寻找子节点  
  68.   DataRow[] rows = dt.Select("ParentID=" + parentID);  
  69.   foreach (DataRow row in rows)  
  70.   {  
  71. tmpNd = new TreeNode();  
  72. tmpNd.Value = row["Id"].ToString();  
  73. tmpNd.Text = row["Name"].ToString();  
  74. tmpNd.NavigateUrl = "main_right.aspx?catalogid=" 
  75. + row["Id"].ToString() + "&catalogName=  
  76. " +Server.UrlEncode(row["Name"].ToString());  
  77. tmpNd.Target = "WorkArea";  
  78. Nds.Add(tmpNd);  
  79.  
  80. InitTree(tmpNd.ChildNodes, Convert.ToInt32(tmpNd.Value), dt);  
  81.   }  
  82.  }  

C#递归树实现实例:从子节点出发考虑

  1. /// <summary>  
  2. /// 反向树生成算法  
  3. /// </summary>  
  4. /// <param name="subtr">子节点</param>  
  5. /// <param name="subto">子节点描述对象</param>  
  6. /// <param name="hashedTreeObject">被保存到哈希表中的子节点描述</param>  
  7. /// <param name="hashedParents">被保存到哈希表中的父节点描述</param>  
  8. /// <param name="allTreeNodes">被保存到哈希表中的所有节点描述</param>  
  9. private void generateParentTreeFromNode(  
  10. TreeNode subtr, CatalogInfo subto, Hashtable hashedTreeObject,   
  11. Hashtable hashedParents, Hashtable allTreeNodes)  
  12. {  
  13.  
  14.  TreeNode trParent;  
  15.  if (null == hashedTreeObject)  
  16.   return;  
  17.  //确定父结点是否存在  
  18.  if (!hashedTreeObject.Contains(  
  19. subto.ParentId) || subto.ParentId == subto.Id )  
  20.  {  
  21.   //不存在则将当前节点作为根  
  22.   if (hashedParents == null)  
  23. hashedParents = new Hashtable();  
  24.   if (!hashedParents.Contains(subto.ParentId))  
  25.   {  
  26. hashedParents.Add(subto.Id, subtr);  
  27. if (!allTreeNodes.Contains(subto.Id))  
  28.  allTreeNodes.Add(subto.Id, subtr);  
  29. trParent = subtr;  
  30.   }  
  31.  }  
  32.  else 
  33.  {  
  34.   //若存在,则获取父结点  
  35.   CatalogInfo to = (CatalogInfo)hashedTreeObject[subto.ParentId];  
  36.   //判断父结点是否已经被保存到树节点的哈希表中  
  37.   if (allTreeNodes.Contains(subto.ParentId))  
  38.   {  
  39. //if (allTreeNodes.Contains(subto.Id))  
  40. // return;  
  41. trParent = (TreeNode)allTreeNodes[subto.ParentId];  
  42. trParent.ChildNodes.Add(subtr);  
  43.   }  
  44.   else 
  45.   {  
  46. //父结点不存在于哈希表中,创建父结点并存放到叶子哈希表中  
  47. trParent = new TreeNode();  
  48. trParent.Text = to.Name;  
  49. trParent.Value = to.Id.ToString();  
  50. allTreeNodes.Add(subto.ParentId, trParent);  
  51. trParent.ChildNodes.Add(subtr);  
  52. //递归向上查找  
  53. generateParentTreeFromNode(trParent, to,   
  54. hashedTreeObject, hashedParents, allTreeNodes);  
  55. if (!allTreeNodes.Contains(subto.Id))  
  56.  allTreeNodes.Add(subto.Id, subtr);  
  57.   }  
  58.  
  59.  }  
  60. }  

C#递归树实现实例的基本内容就向你介绍到这里,希望对你了解和学习C#递归树的实现有所帮助。

【编辑推荐】

  1. C#递归算法理解的实例分析
  2. C#递归思路的使用实例详解
  3. C#递归函数应用实例解析
  4. DropDownList显示的C#递归实现浅析
  5. C#treeview递归操作数据库浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-13 14:36:40

C#结构体构造函数

2009-08-12 16:38:35

C#读取XML节点

2009-08-13 15:48:57

C#指针

2009-09-01 16:59:25

C#画直线

2009-08-27 18:09:49

C#接口的实现

2009-09-01 13:59:01

C#操作Excel

2009-09-09 12:55:59

C# TextBox事

2009-08-17 14:41:47

C#进度条实现

2009-09-03 17:10:57

2009-08-13 10:27:28

C#读取Excel数据

2009-08-20 09:58:06

C#操作文本文件

2009-09-03 17:06:17

C#回车切换焦点

2009-09-03 17:23:45

C#发送邮件

2009-09-02 16:14:21

C#动态创建数组

2009-08-12 10:07:51

C#运算符

2009-08-14 09:50:46

C#复制构造函数

2009-08-17 17:15:48

C# 进度条效果

2009-09-03 14:20:21

C#日期格式化

2009-08-31 12:31:45

C#创建文件夹

2009-09-03 12:52:50

C#打开记事本
点赞
收藏

51CTO技术栈公众号