Witam serdecznie,
napisałem program od generowania drzewa binarnego (każdy node ma dwoje children) w JavaScript.
Schemat drzewa:

Każdy obiekt drzewa posiada nazwę wraz z ID (pole pierwsze ze schematu), oraz poziom na którym występuję (pole drugie). Użytkownik może utworzyć dowolnie duże drzewo, deklarując zmienną levels, która odpowiada za liczbę poziomów drzewa.
Chciałbym dodać teraz nową funkcjonalność. Użytkownik podaję numer gałęzi (np. zmienna node = 3) i otrzymuje tablicę, której każdy indeks jest ścieżką do obiektu znajdującego się poniżej Object_3.
Przykład:
node=3, levels =4 (jeden poziom więcej niż na schemacie)
Otrzymujemy [[Object_1, Object_3] , [Object_1, Object_3, Object_6], , [Object_1, Object_3, Object_7],
[Object_1, Object_3, Object_6, Object_12], [Object_1, Object_3,Object_6, Object_13], itd.]
z generowaniem tego co jest nad węzłem już sobie poradziłem:
var node = 3;
var levels = 4;
level_description = [];
//Tablica w której mam wszelakie informacje o poziomie: lv_nr,ilość obiektow i indexy obj
for (var i = 0; i < levels; i++) {
obj = {};
obj.level = i + 1;
obj.amount = Math.pow(2, i);
obj.indexes = [];
if (i === 0) {
obj.indexes[0] = 1;
level_description.push(obj);
} else {
for (var j = 0; j < obj.amount; j++) {
obj.indexes[j] = obj.amount + j;
}
level_description.push(obj);
}
}
// Where am I?
function FindLevel(node) {
for (var i = 0; i < level_description.length; i++) {
for (var j = 0; j < level_description[i].indexes.length; j++) {
if (node === level_description[i].indexes[j]) {
return level_description[i].level;
}
}
}
}
var level = FindLevel(node);
console.log("You are on: ", level, "level");
var lv_under = levels - level;
console.log("Under there are: ", lv_under, "levels");
var lv_above = levels - lv_under - 1; //Dont count lv on which obj is
console.log("Above there are: ", lv_above, "levels");
// Path above
var path_above = [];
path_above[0] = "APPLICATION";
node_copy = node;
for (var i = lv_above; i > 0; i--) {
path_above[i] = "Object_" + Math.floor(node_copy/(2).toString());
node_copy = node_copy/2;
}
//console.log(path_above);
// + level where object is
path_above[path_above.length] = "Object_" + node.toString();
console.log(path_above);
// Path_under
var level_indexes = [];
node_copy = node;
function Find_indexes(node_copy) {
for (var i = 0; i < lv_under; i++) { // ile poziomow?
var indexes = [];
for (var j = 0; j < Math.pow(2, i + 1); j++) { //ile indexow na poziomie?
indexes[j] = node_copy * 2 + j;
}
level_indexes[i] = [].concat(indexes);
node_copy *= 2;
}
return level_indexes;
}
level_indexes = Find_indexes(node_copy);
Funkcja Find_indexes daje mi informacje o wszystkich ideksach na poziomach poniżej node.
I tutaj niestety utknąłem. Potrzebuję napisać funkcje, która wykorzysta informację z Find_indexes i zwróci tablice wszystkich możliwych ścieżek poniżej node.
Napisałem coś takiego:
var path_under = [];
function path_possibilities(level_indexes) {
var path_possi = [];
for (var i = 0; i < level_indexes.length; i++) {
var arr = [];
if (i === 0) {
path_possi[i] = "Object_" + level_indexes[0][0].toString();
path_possi[i + 1] = "Object_" + level_indexes[0][1].toString();
}
else {
//Tutaj wielu rzeczy próbowałem ale mimo wszystko utknałem
}
}
return path_possi;
}
path_under = path_possibilities(level_indexes);
ale niestety ta funkcja nie jest skończona i mam z nią problem.
Będę wdzięczny za każdy rodzaj pomocy. Pozdrawiam.