структуры данных — N-Ary Tree Как найти уровень узла

Я хотел бы вернуть уровень данного узла. Я был в состоянии сделать это для двоичных деревьев, но для n-арных деревьев нет способа запустить его. Есть идеи ?

Для бинарного дерева решение было:

int findLevel(BinAlbero<int>::node root, BinAlbero<int>::node ptr,
int level = 0) {
if (root == NULL)
return -1;
if (root == ptr)
return level;
// If NULL or leaf Node
if (root->left == NULL && root->right == NULL)
return -1;
// Find If ptr is present in the left or right subtree.
int levelLeft = findLevel(root->left, ptr, level + 1);
int levelRight = findLevel(root->right, ptr, level + 1);
if (levelLeft == -1)
return levelRight;
else
return levelLeft;}

где «ptr» — это узел, для которого ищется уровень. Спасибо. Вот структура N-Ary Tree:

class AlberoN {
public:
typedef T tipoelem;
typedef bool boolean;
struct nodoAlbero {
tipoelem elemento;
struct nodoAlbero* parent;
/*Primo figlio*/
struct nodoAlbero* children;
struct nodoAlbero* brother;
};

typedef nodoAlbero* node;

/*......*/
private:

nodo root;};

Если я использую это дерево:

          8
/  /  \  \
17 30  18  7
/
15

/  \
51  37

Я пытался, но функция возвращает точный уровень только для узлов 17 и 15. С этим кодом:

int findLevel(AlberoN<int> t, AlberoN<int>::nodo root, AlberoN<int>::nodo ptr,
int level = 0) {
if (root == ptr) {
return level;}
if (root == NULL)
return -1;
if (!t.leaf(root)) {
level++;
root = t.firstSon(root);
findLevel(t, root, ptr, level);}
if (!t.lastBrother(root)) {
root = t.succBrother(root);
findLevel(t, root, ptr, level);}
return level;}

0

Решение

int livellofiglio = findLevel(temp, ptr, level + 1);
while (temp != NULL) {
temp = t.succBrother(temp);
int livellofratello = findLevel(temp, ptr, level + 1);
if (livellofiglio == -1)
return livellofratello;
else
return livellofiglio;
}

Вы всегда будете возвращаться после одной итерации цикла, поэтому вы будете посещать только первые два дочерних узла данного узла.

Вы должны всегда перебирать весь массив и возвращать найденное значение (если оно есть):

while (temp != NULL) {
int livellofratello = findLevel(temp, ptr, level + 1);
if (livellofratello != -1)
return livellofratello;
temp = t.succBrother(temp);
}
return -1
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]