如何计算树中节点的向量地址

时间:2011-11-04 11:05:55

标签: vb.net

假设我有一棵树有一个根节点。该根节点有3个子节点。每个子节点有3个子节点,依此类推到4级。如果我从根节点编号每个节点并从左到右编号,则根节点为1,根节点的左子节点为2,根的中间子项为3号,右侧为3号。在第3级,根的左子节点的左子节点为5,依此类推。如果我的数字1到13并且想要将每个数字放入编号相同的节点,即数字1进入根节点,则数字2进入根的左子节点,依此类推。我将如何实现这一目标。 它就像我正在寻找一种获取每个节点的矢量位置的方法,以及一个可以处理任意数量的子节点和任意数量的树高的答案。

感谢

1 个答案:

答案 0 :(得分:0)

嗯,你可以创建一个Lookuptable。所以你甚至可以定义另外数量的子节点,计算所有数字并在字典中添加它们的地址(int,str)。但我猜你很快就会达到一些空间限制。

所以对于只有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