У меня есть три массива, содержащие различную информацию.Первый содержит список объектов, второй содержит список идентификаторов объектов (в соответствии с первым списком), последний содержит список идентификаторов родительских узлов объекта (также по порядку).
Идентификатор родительского узла каждого объекта соответствует идентификатору другого объекта из всех списков.Но если у объекта нет родительского узла, то это базовый узел (родительский идентификатор = -1, все остальные идентификаторы считаются положительно).
Сами объекты содержат массив, который может содержать другие объекты,Мне нужно найти способ вставить детей в родительские узлы.Эта проблема может стать действительно сложной, потому что дочерние элементы должны быть вставлены сверху вниз, иначе дерево сломается, то есть сначала нужно найти базовые узлы, затем вставить их дочерние элементы, затем эти дочерние элементы и т. Д. И т. Д.
Посмотрев на то, что вы только что прочитали, вы можете подумать, рекурсия !!
NOPE
Я пробовал это, но у javascript есть ограничения относительно того, сколько рекурсии можно сделать, когда их слишком много объектов для сортировки, возникает ошибка превышения стека.
Для тех, кто интересуется, как я решал эту проблему раньше, вот мой код:
class Tree{
constructor (indices, sorting_information){
this.base_nodes = [];
for (var i = 0; i < sorting_information.length; i++){
if (!(indices.includes(sorting_information[i]))){
var relevant_info = {
location: i,
id_num: indices[i],
};
var base_node = new Node(relevant_info, indices, sorting_information);
this.base_nodes.push(base_node);
}
}
}
}
class Node {
constructor (id_info, indices, sorting_information){
this.location = id_info.location;
this.id = id_info.id_num;
this.nodes = [];
if (!(this.id == -1)){
for (var i = 0; i < sorting_information.length; i++){
if (sorting_information[i] == this.id){
var relevant_info = {
location: i,
id_num: indices[i],
};
var node = new Node(relevant_info, indices, sorting_information);
this.nodes.push(node);
}
}
}
}
}
Чтобы этот код работал, нужны только два последних списка, поскольку он создает скелетную структуруэто может быть использовано для организации первого списка.
Экземпляр Tree создается с первым и вторым параметрами конструктора, которые являются первым и вторым массивами соответственно.Затем конструктор находит базовые узлы, когда создаются базовые узлы, они находят своих потомков и т. Д. И т. Д.
Ожидаемый ввод:
var nodes = [node_0, node_1, node_2, node_3, node_4, node_5, node_6];
var indices = [0, 1, 2, 3, 4, 5, 6]
var sorting_information = [1, -1, 1, 0, -1, 4, 4]
Ожидаемый вывод:
var base_nodes = [node_1, node_4];
node_1.children = [node_0, node_2];
node_4.children = [node_5, node_6];
node_0.children = [node_3];
Обратите внимание, что дерево данных не обязательно будет принимать двоичную форму.
Я смотрел на эту проблему с разных сторон, но продолжаю испытывать головную боль, любая помощь будет признательна