假设我有一棵树有一个根节点。该根节点有3个子节点。每个子节点有3个子节点,依此类推到4级。如果我从根节点编号每个节点并从左到右编号,则根节点为1,根节点的左子节点为2,根的中间子项为3号,右侧为3号。在第3级,根的左子节点的左子节点为5,依此类推。如果我的数字1到13并且想要将每个数字放入编号相同的节点,即数字1进入根节点,则数字2进入根的左子节点,依此类推。我将如何实现这一目标。 它就像我正在寻找一种获取每个节点的矢量位置的方法,以及一个可以处理任意数量的子节点和任意数量的树高的答案。
感谢
答案 0 :(得分:0)
所以对于只有3个孩子你可以做..(这就像家庭作业一样......)
Private Function getAddress(number As Integer) As List(Of Integer)
Dim _visited As New List(Of Integer)
_visited.Add(number)
Return getAddress(_visited)
End Function
Private Function getAddress(path As List(Of Integer)) As List(Of Integer)
Dim _value As Integer = path(0)
If _value = 1 Then Return path
Select Case _value Mod 3
Case 0
Case 1
_value -= 1
Case 2
_value += 1
End Select
path.Insert(0, _value / 3)
Return getAddress(path)
End Function
使用递归是因为现在知道该地址有多长,但你也可以使用while循环:
Private Function getAddress(number As Integer) As List(Of Integer)
Dim _result As New List(Of Integer)
_result.Insert(0, number)
While number > 1
number = (number + 1) - ((number + 1) Mod 3)
_result.Insert(0, number)
End While
Return _result
End Function
此方法有效的原因是编号系统.. 在看一条路径时..(用括号标记) 您可能会看到“中间”节点始终是其父节点数的3倍。所以1.找到中间节点(这很容易,因为中间节点是唯一给出mod 3 = 0的节点 如果mod 3 = 1则减去1,mod 3 = 2则加1 然后将值除以3以达到其父级。 继续它直到你达到1
(1)
(2) 3 4
5 (6) 7
17 18 19
哦,你不受那3棵儿童树的限制。此方法可以与任意数量的子节点一起使用。始终使用倒数第二个子节点并将其数量除以子节点数。唯一棘手的问题是在一行中计算正确的节点。在多行中它应该是:
If (number - 1) mod childs = 0 Then
Return number -1
Else
Return (number -1) + (5 - ((number -1) mod childs))
End If
添加文字
因此,如果您从-1开始计算,我将构建一个这样的函数:
Private Function AdjustResult(wrongCount as List(Of Integer)) as List(Of Integer)
Dim _oldStart as Integer = 1
Dim _newStart as Integer = -1
Dim _diff as Integer = _newStart - _oldStart 'should be -2
Dim _newResult as New List(Of Integer)
For each ele in wrongCount
_newResult.add(ele + _diff)
Next
return _newResult
End Function
最好不要尝试在计算中添加该功能。使用调用计算的新方法,然后调用函数来更正结果...
Private Function getNewAddress(number as Integer) as List(Of Integer)
'Call old Method
Dim _result as List(Of Integer) = getAddress(number)
'Correct results to fit for numbering from -1 instead of 1
_result = AdjustResult(_result)
Return _result
End Function