#vb.net
#vb.net
Вопрос:
предположим, у меня есть дерево с корневым узлом. у этого корневого узла есть 3 дочерних узла. у каждого дочернего узла есть 3 дочерних узла и так далее, скажем, до уровня 4. если я нумерую каждый узел от корневого узла и нумерую слева направо, корневой узел — номер 1, а левый дочерний элемент корня — номер 2, средний дочерний элемент корня — номер 3, а нижний дочерний элемент — номер 4.справа — номер 3. на третьем уровне левый дочерний узел левого дочернего узла корня равен номеру 5 и так далее. если у меня есть числа от 1 до 13, и я хочу поместить каждое число в узел с одинаковым номером, т.е. число 1 попадает в корневой узел, число 2 попадает в левый дочерний узел корня и так далее. как бы я этого добился. похоже, я ищу способ получить векторное местоположение каждого узла и ответ, который может работать с любым количеством дочерних узлов и любым числом высоты дерева.
Спасибо
Комментарии:
1. это не имеет особого смысла. как вы можете сказать, что узел является «левым», «средним» или «правым»? предоставьте некоторый код и / или логику, лежащую в основе ваших рассуждений.
2. Не очень понятно, что может означать «вектор». Проработайте свой путь наизнанку, используя TreeNode. Родительские и индексные свойства. Пока у вас не закончатся родители.
3. извините, ребята, может быть, я не очень хорошо объясняю сценарии. но чего я пытаюсь добиться, так это получить адрес узла в терминах чисел из корневого узла. например, чтобы добраться до узла с номером 2, мой адрес равен 1-2, а чтобы добраться до узла с номером 3, мой адрес равен 1-3, а чтобы добраться до 5, мой адресравно 1—2 —5 и так далее. другими словами, я хотел бы распределить пронумерованные элементы в узел с тем же номером, т.е. 1 в корень и так далее. позвольте мне проверить, как прикреплять изображения, чтобы я мог прикрепить изображение дерева, о котором я говорю.
Ответ №1:
хм, вы могли бы создать справочную таблицу. таким образом, вы могли бы даже определить другое количество дочерних элементов, вычислить все числа и добавить их адрес в словарь (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
Комментарии:
1. Большое спасибо за ваш ответ, я не думал, что буду таким маленьким фрагментом кода, как этот. он работает точно так, как я хотел, просто нужно протестировать с большим количеством дочерних элементов.
2. я протестировал и его работу с любым количеством дочерних узлов, большое спасибо.
3. как бы вы изменили свой код, чтобы считать от -1, т.е. корневой узел должен быть равен -1, а первый дочерний узел равен 0, а второй равен 1 и так далее?
4. Привет, я думаю, что при другом подсчете вычисление просто усложнится. Поэтому я был бы относительно ленив, и вместо изменения вычислений я бы добавил вычисление впоследствии.. Я отредактирую свой ответ из-за форматирования
5. Большое спасибо, мне удалось добиться желаемых результатов.