Я хотел бы спросить, знает ли кто-нибудь эффективный способ сохранить путь от корневого узла к новому узлу многостороннего дерева во время вставки нового узла. Например, если у меня есть следующее дерево:
Для каждого узла я в настоящее время сохраняю массив пути к узлу от корневого узла во время вставки следующим образом, назначая уникальный int
ID каждому дочернему элементу на той же глубине:
Root node -> [1]
Depth 1, child 1 of root -> [1, 1]
Depth 1, child 2 of root -> [1, 2]
Depth 2, child 1 of parent 1 -> [1, 1, 1]
Depth 2, child 2 of parent 1 -> [1, 1, 2]
Depth 2, child 3 of parent 1 -> [1, 1, 3]
Depth 2, child 1 of parent 2 -> [1, 2, 4]
Depth 2, child 2 of parent 2 -> [1, 2, 5]
Depth 3, child 1 of parent 3 -> [1, 1, 3, 1]
...
Если я теперь вставлю новый узел из листового узла 1
на глубину 3, мне придется создать для него новый массив путей, в котором будут храниться все узлы родительского 1
(т.е. [1, 1, 3, 1]
) плюс новый дочерний идентификатор, который равен 1
для Первый ребенок:
Depth 4, child 1 of parent 1 -> [1, 1, 3, 1, 1]
Поскольку мое дерево сильно растет в высоту (количество дочерних элементов на глубину относительно невелико, но глубина может быть высокой), медленной частью этого алгоритма будет процесс воссоздания массива. Только представьте себе дерево глубины 1.000.000
, если я вставлю новый узел из узла глубины 1.000.000
, мне придется создать новый массив для этого нового узла, в котором будут храниться все 1.000.001
идентификаторы родительского элемента, плюс добавление идентификатора нового узла:
Depth 1.000.001, child 1 of parent x -> [...1 million and one IDs... , 1]
Есть ли более эффективный способ сохранить путь на каждом узле во время вставки узла?
Мне в основном это нужно, чтобы определить, является ли какой-либо данный узел дочерним по отношению к возможному родительскому узлу в дереве, и поскольку у меня есть путь, хранящийся в каждом узле, я могу легко сделать это, проверив массив путей дочернего элемента, например:
// Ex. 1
Is node 4 of depth 2 the parent/ancestor of node 1 of depth 3?
node 1 of depth 3 has the following path array: pathArray = [1, 1, 3, 1]
Its ancestor ID on depth 2 is: pathArray[2] -> 3
3 != 4 and therefore I know that node 4 of depth 2
is not a parent of node 1 of depth 3.
// Ex. 2
Is node 1 of depth 1 the parent/ancestor of node 1 of depth 3?
node 1 of depth 3 has the following path array: pathArray = [1, 1, 3, 1]
Its ancestor ID on depth 1 is: pathArray[1] -> 1
1 == 1 and therefore I know that node 1 of depth 1
is a parent of node 1 of depth 3.
Эта операция поиска будет быстрой, проблема заключается в создании массива путей по мере того, как дерево углубляется.
Мы ценим любые предложения.
Спасибо за внимание.
given a node x, is the k'th node on the path from root to x the node y
? - person SecularisticSloth   schedule 25.08.2019given two nodes x and y, x is an ancestor of y
. При этом мне нужно сохранить путь отroot
кx
и присвоитьy
уникальный идентификатор его глубины / уровня в дереве. - person tonix   schedule 25.08.2019x
предкомy
, у меня уже есть ссылка на узлыx
иy
, и я также знаю глубинуy
и глубинуx
. Я не знаю, действительно лиx
является предком (это может быть даже дочерний элементy
, или, может быть, это узел в другой ветке, как в первом примере). Если сthe same identities appear on multiple levels in the tree
вы имеете в видуthe same values
, то да, это может случиться, но для меня это не проблема, меня не интересует значение узла, мне просто нужно знать, сохраняются ли отношения предок-потомок. - person tonix   schedule 25.08.2019