Recorrido de orden vertical del árbol binario de modo que los Nodes se ordenen individualmente

Dado un árbol binario , imprímalo verticalmente. 

NOTA: Si hay varios Nodes en el mismo punto, imprímalos en orden.

Ejemplos:

Entrada:         1
               / \ 
             2 3
           / \ / \
        4 11 6 7
                      / \  
                    8 9  
Salida: [ [4], [2], [1, 6, 11], [3, 8], [7], [9 ] ]
Explicación: Atravesar el árbol verticalmente da el resultado anterior.

Entrada:         5
               / \ 
             4 6
           / \ /   
        3 1 2
Salida: [ [3], [4], [1, 2, 5], [6] ]    

 

Enfoque: Este problema es similar a Imprimir un árbol binario en orden vertical . En ese problema, si hay 2 Nodes en la misma vertical y en el mismo nivel, se requiere imprimir de izquierda a derecha, pero este problema requiere imprimirlo en el orden ordenado. Para eso, tome la cola y el mapa que consta de un par de enteros y conjuntos múltiples para almacenar múltiples Nodes que también pueden tener el mismo valor.

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

C++

// C++ program for above approach
#include <bits/stdc++.h>
using namespace std;
 
// Structure for a binary tree node
struct Node {
    int key;
    Node *left, *right;
};
 
// A utility function to create a new node
struct Node* newNode(int key)
{
    struct Node* node = new Node;
    node->key = key;
    node->left = node->right = NULL;
    return node;
}
 
// Function to print vertical traversal
// of a binary tree
vector<vector<int> > printVerticalOrder(Node* root)
{
 
    // map<vertical, map<level,
    // multiset<node values> > >
    map<int, map<int, multiset<int> > > mpp;
 
    // queue<Nodes, vertical, level>
    queue<pair<Node*, pair<int, int> > > q;
 
    q.push({ root, { 0, 0 } });
 
    while (!q.empty()) {
        auto p = q.front();
        q.pop();
 
        Node* temp = p.first;
 
        // Vertical
        int vertical = p.second.first;
 
        // Level
        int level = p.second.second;
 
        // 2,0 -> {5,6} insert in the multiset
        mpp[vertical][level].insert(temp->key);
 
        // If left child of the node exits
        // then push it on the queue
        // with vertical decremented and
        // level incremented
        if (temp->left)
            q.push({ temp->left,
                     { vertical - 1,
                      level + 1 } });
 
        // If right child of the node exits
        // then push it on the queue
        // with vertical incremented and
        // level incremented
        if (temp->right)
            q.push({ temp->right,
                     { vertical + 1,
                      level + 1 } });
    }
 
    vector<vector<int> > ans;
 
    // Traverse the multiset part of each map
    for (auto p : mpp) {
        vector<int> col;
        for (auto q : p.second) {
            col.insert(col.end(),
                       q.second.begin(),
                       q.second.end());
        }
        ans.push_back(col);
    }
    return ans;
}
 
// Driver Code
int main()
{
    Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(11);
    root->right->left = newNode(6);
    root->right->right = newNode(7);
    root->right->left->right = newNode(8);
    root->right->right->right = newNode(9);
 
    // To store the vertical order traversal
    vector<vector<int> > v =
        printVerticalOrder(root);
 
    for (auto i : v) {
        for (auto j : i) {
            cout << j << " ";
        }
        cout << endl;
    }
    return 0;
}
Producción

4 
2 
1 6 11 
3 8 
7 
9 

Complejidad de tiempo: O(N*logN*logN*logN) 
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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