Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 17234|回复: 25

[已解决]如何用递归来做一个遍历树

[复制链接]
发表于 2013-2-19 19:12 | 显示全部楼层 |阅读模式
本帖最后由 nstxdyd 于 2013-2-20 19:43 编辑

遇到一个心烦的问题,具体描述如下图:

郁闷。。。一天了这问题都还没搞定,是我表达有问题 ?

就是想对 父ID 和 ID 两列进行遍历,然后输出 长短不一的 遍历树。

附件是EXCEL表格。。

我做的这个详细描述2图  左边是 父子关系表,共19行关系。  右边是我根据左边19个关系做出来的表。另外用三色框 特别描述出了其中的一套关系。希望大家看得明白。

又加了一个树形结构图,希望表达更清晰些。。。


最佳答案
2013-2-21 10:56

  1. Dim z As Object    '子key,父item。用于递归时的查询

  2. Sub test()
  3.     Dim f As Object    '父key。只在收集叶子时的查询
  4.     Dim A(), B(), i%, j%

  5.     A = Range("a1").CurrentRegion.Value
  6.     Set f = CreateObject("scripting.dictionary")
  7.     Set z = CreateObject("scripting.dictionary")

  8.     '建字典,收叶子
  9.     For i = 2 To UBound(A)
  10.         f(A(i, 1)) = A(i, 2)
  11.         z(A(i, 2)) = A(i, 1)
  12.     Next i

  13.     For i = 2 To UBound(A)
  14.         If f.exists(A(i, 2)) = False Then
  15.             j = j + 1: ReDim Preserve B(1 To j): B(j) = A(i, 2)
  16.         End If
  17.     Next i

  18.     '找出每个叶的关系
  19.     For i = 1 To UBound(B)
  20.         B(i) = dg(B(i))
  21.     Next i
  22.     Columns(5).Clear
  23.     [f1].Resize(i - 1) = Application.Transpose(B)

  24. End Sub

  25. Function dg(yz)    'yz表示叶子,也是相对他的父亲来说的。
  26.     If z.exists(z(yz)) Then    '判断此子的父是不是子
  27.         dg = dg(z(yz)) & " > "     '父居左的关系字符串
  28.     Else
  29.         dg = z(yz) & " > "    '到顶端了
  30.     End If
  31.     dg = dg & yz
  32. End Function
复制代码
(, 下载次数: 103)

树形结构图

树形结构图

详细描述2

详细描述2

递归.rar

50.74 KB, 下载次数: 167

 楼主| 发表于 2013-2-19 19:13 | 显示全部楼层
如果不用SQL 而是通过VBA的效果进行操作,如何实现将多层级的父子孙等等层级关系逐行输出到sheet2?
回复

使用道具 举报

 楼主| 发表于 2013-2-20 10:02 | 显示全部楼层
求高手指点下啊。。。完全没头绪
回复

使用道具 举报

 楼主| 发表于 2013-2-20 13:58 | 显示全部楼层
。。。。难道这个题目太难了 ?
回复

使用道具 举报

发表于 2013-2-20 14:15 来自手机 | 显示全部楼层
不懂题目是要做什么。

楼主能模拟实现后的效果吗?
如果不方便,那用几十行或更少数据,能体现吗?
回复

使用道具 举报

发表于 2013-2-20 15:00 | 显示全部楼层
楼主没示例清楚
树遍历有先根后根之别,子树还是有顺序
你的示例是怎么的?
回复

使用道具 举报

 楼主| 发表于 2013-2-20 16:31 | 显示全部楼层
大家好,我又来了。由于上班,不能一直盯着论坛。自己看了下自己之前的描述,确实可能不够详细,所以我重新描述了下,并举了个例子。
希望大家能看得明白。

详细说明

详细说明
回复

使用道具 举报

发表于 2013-2-20 17:06 | 显示全部楼层
对于7楼
1)结果是针对数据源为a3:b20的吗?

2)为什么结果只12行?是不是说只有12种可能

3)结果说‘可能还有其它列’。也许数据源仍多了,使得你不能模拟完整结果。前面也提过,能否再少点数据,就为看到完整效果,好理解规律。
回复

使用道具 举报

 楼主| 发表于 2013-2-20 17:37 | 显示全部楼层
1.是的。“期望结果表” 所看到的 是仅针对数据源 a3:b20;
2.之所以结果只有12行,是因为针对左表的父子关系 只能列出这12行啊。。。
回复

使用道具 举报

 楼主| 发表于 2013-2-20 17:38 | 显示全部楼层
3.之所以说还有其他列,是因为我的数据源 不只有这 a3:b20 这么点点。。可以看我之前上传的文件,有四千多行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 08:49 , Processed in 0.420588 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表