Recorrido de orden de nivel al convertir N-ary Tree en una representación de lista de adyacencia con K como Node raíz

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:

1 9 10 11 
2 3 4 
6 7 8

Entrada: Árbol en la imagen de abajo, K = 5

Salida:

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;
}
Producción:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *