|
来个非递归版的,关键在于回溯信息控制,比递归难写许多
- Option Explicit
- Dim d, dp, arr
- Sub buildTree()
- Dim i&, arr, rend&, mkey
- With Sheet2
- rend = .Range("A1").End(xlDown).Row
- arr = .Range("a2:b" & rend)
- End With
- Set d = CreateObject("scripting.dictionary")
- Set dp = CreateObject("scripting.dictionary")
- For i = 1 To UBound(arr)
- If Not d.exists(arr(i, 1)) Then
- d(arr(i, 1)) = arr(i, 2)
- If arr(i, 2) <> "" Then dp(arr(i, 2)) = arr(i, 1)
- Else
- If arr(i, 2) <> "" Then
- d(arr(i, 1)) = d(arr(i, 1)) & "++" & arr(i, 2)
- dp(arr(i, 2)) = arr(i, 1)
- End If
- End If
- Next
- For Each mkey In d.keys
- If dp(mkey) = "" Then d("root") = d("root") & "++" & mkey
- Next
- d("root") = Right(d("root"), Len(d("root")) - 2)
- End Sub
- Sub NodeSearchFDG(root As String)
- Dim workStack$(), top&, str$, mnode$, mr&, brr, crr, i&, mc& 'workstack工作栈,top栈顶变量
- top = 1: mnode = root: mr = 1: mc = 1
- ReDim Preserve workStack(0 To top)
- workStack(top - 1) = "root++1++1"
- Do While top >= 1
- arr(mr, mc) = mnode
- str = d(mnode)
- If str <> "" Then mc = mc + 1 Else mr = mr + 1
- brr = Split(str & "++", "++")
- For i = UBound(brr) To 0 Step -1 '倒写,保持顺序
- If brr(i) <> "" Then
- top = top + 1
- workStack(top - 1) = brr(i) & "++" & mc '压栈
- If top > UBound(workStack) Then ReDim Preserve workStack(0 To top)
- End If
- Next
- If top > 0 Then
- crr = Split(workStack(top - 1), "++")
- mnode = crr(0): mc = crr(1)
- top = top - 1 '弹栈
- End If
- Loop
- Erase brr, crr, workStack$
- End Sub
- Sub aa()
- ReDim arr(1 To 1000, 1 To 20)
- Call buildTree
- Call NodeSearchFDG("root")
- Range("M1").Resize(UBound(arr), UBound(arr, 2)).ClearContents
- Range("M1").Resize(UBound(arr), UBound(arr, 2)) = arr
- Set d = Nothing: Set dp = Nothing: Erase arr
- End Sub
复制代码 |
评分
-
1
查看全部评分
-
|