Recorrido de abajo a la izquierda a arriba a la derecha en un árbol binario

Dado un árbol binario , la tarea es imprimir el recorrido de abajo a la izquierda a arriba a la derecha del árbol binario dado , es decir, el recorrido de orden de nivel que tiene el nivel como Node de abajo a la izquierda a arriba a la derecha.

Ejemplos:

Entrada: A continuación se muestra el árbol dado:

Salida: 2 7 2 5 6 5 11 4 9
Explicación:
 

Nivel 1: 2 7 2 (hacia arriba desde la parte inferior izquierda a la derecha hasta la raíz) 
Nivel 2: 5 6 5 (a la derecha de cada Node en la capa 1/o desde la parte inferior izquierda hacia arriba a la derecha en esta capa)
Nivel 3: 11 4 9 (a la derecha desde cada Node en la capa 2/o abajo a la izquierda hacia arriba a la derecha en esta capa) 

Entrada: 1 2 3 4 5 6 7
Salida: 4 2 1 5 6 3 2
Explicación
Capa 1: 4 2 1 (hacia arriba de izquierda a derecha hasta la raíz)
Capa 2: 5 6 3 (a la derecha de cada Node en la capa 1 /o de abajo a la izquierda a arriba a la derecha en esta capa)
Capa 3: 2 (a la derecha de cada Node en la capa 2/o de abajo a la izquierda a arriba a la derecha en esta capa)

Enfoque: La idea es utilizar la técnica de Búsqueda Primero en Amplitud . Siga los pasos necesarios para resolver este problema:

  • Inicialice una capa en un árbol binario. Es una lista de Nodes que comienza desde el Node más a la izquierda de la parte inferior al lado de la capa anterior y termina con el Node más a la derecha de la parte superior al lado de la capa anterior.
  • Cree una pila para almacenar todos los Nodes en cada capa.
  • Inicialice una cola para mantener las » raíces » en cada capa, una raíz en una capa es un Node desde el cual se puede ir hacia abajo usando solo los hijos izquierdos.
  • Empuje el Node raíz de la primera capa (la raíz del árbol) en la cola.
  • Defina un indicador (digamos lyr_root ) un Node esperado al final de una capa que es el encabezado de capa actual, un encabezado de capa es el primer Node en una capa.
  • Atraviese hasta que la cola no esté vacía y haga lo siguiente:
    • Obtenga una raíz de capa desde el frente de la cola
    • Si esta raíz de capa es el encabezado de capa de una nueva capa, extraiga todos los elementos de la pila , es decir, del elemento de capa anterior, e imprímalo.
    • Atraviese la capa desde la parte superior derecha hasta la parte inferior izquierda y para cada elemento, si tiene un hijo derecho, compruebe si el Node atravesado es el encabezado de la capa o no. Si se determina que es cierto, cambie el indicador esperado para indicar el siguiente encabezado de capa.
    • Empuje al niño correcto a la raíz en la cola.
    • Empuje el Node atravesado en la pila.
  • Después de atravesar todas las capas, es posible que la capa final aún esté en la pila, por lo que debemos extraer todos los elementos e imprimirlos.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
 
// Node Structures
typedef struct Node {
    int data;
    Node* left;
    Node* right;
} Node;
 
// Function to add the new Node in
// the Binary Tree
Node* newNode(int data)
{
    Node* n;
 
    // Create a new Node
    n = new Node();
    n->data = data;
    n->right = NULL;
    n->left = NULL;
    return n;
}
 
// Function to traverse the tree in the
// order of bottom left to the upward
// right order
vector<int>
leftBottomTopRightTraversal(Node* root)
{
    // Stores the data of the node
    vector<int> rr;
 
    // Stores every element in each layer
    stack<int> r;
 
    // Stores the roots in the layers
    queue<Node*> roots;
 
    // Push the layer head of the
    // first layer
    roots.push(root);
 
    // Define the first layer head
    // as the tree root
    Node* lyr_root = root;
 
    // Traverse all layers
    while (!roots.empty()) {
 
        // get current layer root
        Node* n = roots.front();
 
        // Pop element from roots
        roots.pop();
        if (lyr_root == n) {
 
            // Layer root was also
            // the layer head
            while (!r.empty()) {
 
                rr.push_back(r.top());
 
                // Pop every element
                // from the stack
                r.pop();
            }
        }
 
        while (n) {
 
            if (n->right) {
 
                // Current traversed node
                // has right child then
                // this root is next layer
                if (n == lyr_root) {
                    lyr_root = n->right;
                }
 
                // Push the right child
                // to layer roots queue
                roots.push(n->right);
            }
 
            // Push node to the
            // layer stack
            r.push(n->data);
            n = n->left;
        }
    }
 
    // Insert all remaining elements
    // for the traversal
    while (!r.empty()) {
 
        // After all of the layer
        // roots traversed check the
        // final layer in stack
        rr.push_back(r.top());
        r.pop();
    }
 
    // Return the traversal of nodes
    return rr;
}
 
// Function that builds the binary tree
// from the given string
Node* buildBinaryTree(char* t)
{
    Node* root = NULL;
 
    // Using queue to build tree
    queue<Node**> q;
    int data = 0;
 
    // Stores the status of last
    // node to be ignored or not
    bool ignore_last = false;
    while (*t != '\0') {
        int d = *t - '0';
 
        // If the current character
        // is a digits then form the
        // number of it
        if (d >= 0 && d <= 9) {
            data *= 10;
            data += d;
            ignore_last = false;
        }
 
        // If the current character
        // is N then it is the
        // NULL node
        else if (*t == 'N') {
            data = 0;
            q.pop();
            ignore_last = true;
        }
 
        // If space occurred then
        // add the number formed
        else if (*t == ' ') {
 
            // If last is ignored
            if (!ignore_last) {
 
                // If root node is not NULL
                if (root) {
 
                    Node** p = q.front();
                    q.pop();
 
                    if (p != NULL) {
                        *p = newNode(data);
                        q.push(&((*p)->left));
                        q.push(&((*p)->right));
                    }
                }
 
                // Else create a new
                // root node
                else {
                    root = newNode(data);
                    q.push(&(root->left));
                    q.push(&(root->right));
                }
                data = 0;
            }
        }
 
        // Increment t
        t++;
    }
 
    // Return the root node of the tree
    return root;
}
 
// Driver Code
int main()
{
    // Given order of nodes
    char T[] = "2 7 5 2 6 N 9 N N 5 11 4 N";
 
    // Builds the Binary Tree
    Node* root = buildBinaryTree(T);
 
    // Function Call
    vector<int> result
        = leftBottomTopRightTraversal(root);
 
    // Print the final traversal
    for (int i = 0; i < result.size(); ++i) {
        cout << result[i] << " ";
    }
 
    return 0;
}
Producción: 

2 7 2 5 6 5 11 4 9

 

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por ephi2g 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 *