首页 新闻 会员 周边

大侠们,这棵树怎么生成?

0
悬赏园豆:50 [已解决问题] 解决于 2012-07-25 22:29
 
 
 
 
如图,以前处理树,它们的字段都是针对节点的【如在数据库中的存储都是,ID,parentID】,对于这种平铺的结构怎么处理比较简单呢? 
 
智客工坊的主页 智客工坊 | 小虾三级 | 园豆:1855
提问于:2012-07-11 22:40
< >
分享
最佳答案
0

一种方法,很好使,又快:

Dictionary<level1,Dictionary<level2,Dictionary<level3,List<level4>>>>

伪码:

foreach(DataRow dr in DataTable.Rows)

{

  string level1 = dr[0].ToString();

      string level2=dr[1].ToString();

      string level3 = dr[2].ToString();

      string level4 = dr[3].ToString();

      if(dicLevel1.ContainsKey(level1))

      {

              //把字典提出来,然后加入

      }

      else

     {

            //新建个字典

     }

}

 

示意为止,能明白吧,不明白接着问我。就是用字典组成棵树。查树的数据也相当快。

收获园豆:20
幽灵~ | 菜鸟二级 |园豆:268 | 2012-07-13 11:24
其他回答(4)
0

 个人感觉 使用递归算法

收获园豆:10
Mundo Novo | 园豆:69 (初学一级) | 2012-07-11 22:51

递归是必须的,就是如何去做呢 呵呵

支持(0) 反对(0) 智客工坊 | 园豆:1855 (小虾三级) | 2012-07-12 08:37

@Good_Luck: 

  做过树形菜单么?   你需要定义好条件。

 

 1     protected void BingBookNaiget(int pid, TreeNode pNode)
 2         {
 3             //请用递归方法理解
 4 
 5             List<Category> list = CategoryManagers.GetCategoriesByPId(pid);
 6             if (list != null)
 7             {
 8                 foreach (Category item in list)
 9                 {
10                     TreeNode node = new TreeNode();
11                     node.Value = item.PId.ToString();
12                     node.NavigateUrl = ResolveUrl("~/Book/list.aspx") + "?pid=" + pid;
13                     node.Text = item.Name;
14                     if (pid == 0)
15                     {
16                         //添加父节点
17                         bookNaiget.Nodes.Add(node);
18                         //  bookNaiget.Nodes.Add(new TreeNode("ddd|"));
19 
20                     }
21                     else
22                     {
23                         //添加子节点
24                         pNode.ChildNodes.Add(node);
25 
26                     }
27                     BingBookNaiget(item.Id, node);
28                 }
29             }
30 
31         }


这是代码剩下的 需要你自己了

支持(0) 反对(0) Mundo Novo | 园豆:69 (初学一级) | 2012-07-14 23:29
0
--drop table #Tmp
create table #Tmp
(
    id int,
    level1  varchar(5),
    level2  varchar(5),  
    level3  varchar(5),
    level4  varchar(5)    
);
insert into #Tmp
select 1,'A','B','C','D'
insert into #Tmp
select 2,'A','F','C','D'
insert into #Tmp
select 3,'B','C','F','D'

select * from #Tmp

select newstr
from
(
    select ''+level1 as newstr,id, 1 as orderid from #Tmp
    union all
    select '----'+level2, id,2 as orderid from #Tmp
    union all
    select '--------'+level3,id, 3 as orderid from #Tmp
    union all
    select '------------'+level4,id, 4 as orderid from #Tmp
)t
order by id,orderid

--truncate table #Tmp

表的部分我加了个id

不知道你的数据表有没有id字段,或者其它能体现顺序的。不然下面没法排序。

owsir | 园豆:481 (菜鸟二级) | 2012-07-12 09:32
0

数据库为什么设计成这样?用一个字段来标记父节点不行吗?

收获园豆:10
code先生-null | 园豆:307 (菜鸟二级) | 2012-07-12 16:18
0

我觉得你可以考虑一下两种方式:

1、ID,PID字段,这种方式使用递归方式获取,可以支持非常多的节点

2、使用编码长度规则表+内容表,这种方式使用定长编码规则,好处是速度非常快,适合类别不多,但是明细很多的。

收获园豆:10
归真 | 园豆:605 (小虾三级) | 2012-07-14 18:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册