Dado el Node raíz de un árbol N-ario y un número entero K , la tarea es convertir el árbol dado en una representación de lista de adyacencia e imprimir el recorrido de orden de niveles considerando el vértice K como el Node raíz.
Ejemplo:
Entrada: Árbol en la imagen de abajo, K = 5
Salida:
5
1 9 10 11
2 3 4
6 7 8Entrada: Árbol en la imagen de abajo, K = 5
Salida:
5
1
2 3 4
7 8
Enfoque: El problema dado se puede resolver usando el DFS Traversal en el árbol N-ario y almacenando la relación de todos los bordes en una lista de adyacencia de acuerdo con la representación de la lista de adyacencia . La lista de adyacencia creada se puede utilizar para imprimir el recorrido de orden de nivel con K como Node raíz. Esto se puede hacer usando el recorrido BFS que se analiza en este artículo .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // A binary tree node struct Node { int data; vector<Node*> child; }; // Function to create a new tree node Node* newNode(int key) { Node* temp = new Node; temp->data = key; return temp; } // Adjacency list to store the Tree vector<vector<int> > adj; // Function to perform the DFS traversal // of the N-ary tree using the given // pointer to the root node of the tree void DFS(struct Node* node) { // Traverse all child of node for (auto x : node->child) { if (x != NULL) { // Insert the pair of vertices // into the adjacency list adj[node->data].push_back(x->data); adj[x->data].push_back(node->data); // Recursive call for DFS on x DFS(x); } } } // Function to print the level order // traversal of the given tree with // s as root node void levelOrderTrav(int s, int N) { // Create a queue for Level // Order Traversal queue<int> q; // Stores if the current // node is visited vector<bool> visited(N); q.push(s); // -1 marks the end of level q.push(-1); visited[s] = true; while (!q.empty()) { // Dequeue a vertex from queue int v = q.front(); q.pop(); // If v marks the end of level if (v == -1) { if (!q.empty()) q.push(-1); // Print a newline character cout << endl; continue; } // Print current vertex cout << v << " "; // Add the child vertices of // the current node in queue for (int u : adj[v]) { if (!visited[u]) { visited[u] = true; q.push(u); } } } } // Driver Code int main() { Node* root = newNode(1); (root->child).push_back(newNode(2)); (root->child).push_back(newNode(3)); (root->child).push_back(newNode(4)); (root->child).push_back(newNode(5)); (root->child[0]->child).push_back(newNode(6)); (root->child[0]->child).push_back(newNode(7)); (root->child[2]->child).push_back(newNode(8)); (root->child[3]->child).push_back(newNode(9)); (root->child[3]->child).push_back(newNode(10)); (root->child[3]->child).push_back(newNode(11)); int N = 11; int K = 5; adj.resize(N + 1, vector<int>()); DFS(root); levelOrderTrav(5, 11); return 0; }
5 1 9 10 11 2 3 4 6 7 8
Complejidad temporal: O(N)
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por iramkhalid24 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA