Aplanar el árbol binario en orden de recorrido de orden de nivel

Dado un árbol binario, la tarea es aplanarlo en el orden de nivel de recorrido del árbol. En el árbol binario aplanado, el Node izquierdo de todos los Nodes debe ser NULL.
Ejemplos: 
 

Input: 
          1 
        /   \ 
       5     2 
      / \   / \ 
     6   4 9   3 
Output: 1 5 2 6 4 9 3

Input:
      1
       \
        2
         \
          3
           \
            4
             \
              5
Output: 1 2 3 4 5

Enfoque: Resolveremos este problema simulando el recorrido de orden de nivel del árbol binario de la siguiente manera: 
 

  1. Cree una cola para almacenar los Nodes del árbol binario.
  2. Cree una variable «anterior» e inicialícela por Node principal.
  3. Empuje a los hijos izquierdo y derecho del padre en la cola.
  4. Aplicar recorrido de orden de nivel. Digamos que «curr» es el elemento más frontal en la cola. Después, 
    • Si ‘curr’ es NULL, continúe.
    • De lo contrario, presione curr->left y curr->right en la cola
    • Establecer anterior = actual

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

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Node of the Binary tree
struct node {
    int data;
    node* left;
    node* right;
    node(int data)
    {
        this->data = data;
        left = NULL;
        right = NULL;
    }
};
 
// Function to flatten Binary tree using
// level order traversal
void flatten(node* parent)
{
    // Queue to store nodes
    // for BFS
    queue<node*> q;
    q.push(parent->left);
    q.push(parent->right);
    node* prev = parent;
 
    // Code for BFS
    while (q.size()) {
         
        // Size of queue
        int s = q.size();
        while (s--) {
             
            // Front most node in
            // the queue
            node* curr = q.front();
            q.pop();
 
            // Base case
            if (curr == NULL)
                continue;
            prev->right = curr;
            prev->left = NULL;
            prev = curr;
 
            // Pushing new elements
            // in queue
            q.push(curr->left);
            q.push(curr->right);
        }
    }
 
    prev->left = NULL;
    prev->right = NULL;
}
 
// Function to print flattened
// Binary Tree
void print(node* parent)
{
    node* curr = parent;
    while (curr != NULL)
        cout << curr->data << " ", curr = curr->right;
}
 
// Driver code
int main()
{
    node* root = new node(1);
    root->left = new node(5);
    root->right = new node(2);
    root->left->left = new node(6);
    root->left->right = new node(4);
    root->right->left = new node(9);
    root->right->right = new node(3);
 
    // Calling required functions
    flatten(root);
    print(root);
     
    return 0;
}

Java

// Java implementation of the approach
import java.util.*;
 
class GFG
{
     
// Node of the Binary tree
static class node
{
    int data;
    node left;
    node right;
    node(int data)
    {
        this.data = data;
        left = null;
        right = null;
    }
};
 
// Function to flatten Binary tree using
// level order traversal
static void flatten(node parent)
{
    // Queue to store nodes
    // for BFS
    Queue<node> q = new LinkedList<>();
    q.add(parent.left);
    q.add(parent.right);
    node prev = parent;
 
    // Code for BFS
    while (q.size() > 0)
    {
         
        // Size of queue
        int s = q.size();
        while (s-- > 0)
        {
             
            // Front most node in
            // the queue
            node curr = q.peek();
            q.remove();
 
            // Base case
            if (curr == null)
                continue;
            prev.right = curr;
            prev.left = null;
            prev = curr;
 
            // Pushing new elements
            // in queue
            q.add(curr.left);
            q.add(curr.right);
        }
    }
    prev.left = null;
    prev.right = null;
}
 
// Function to print flattened
// Binary Tree
static void print(node parent)
{
    node curr = parent;
    while (curr != null)
    {
        System.out.print(curr.data + " ");
        curr = curr.right;
    }
}
 
// Driver code
public static void main(String[] args)
{
    node root = new node(1);
    root.left = new node(5);
    root.right = new node(2);
    root.left.left = new node(6);
    root.left.right = new node(4);
    root.right.left = new node(9);
    root.right.right = new node(3);
 
    // Calling required functions
    flatten(root);
    print(root);
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python implementation of above algorithm
 
# Utility class to create a node
class node:
    def __init__(self, key):
        self.data = key
        self.left = self.right = None
 
# Function to flatten Binary tree using
# level order traversal
def flatten( parent):
 
    # Queue to store nodes
    # for BFS
    q = []
    q.append(parent.left)
    q.append(parent.right)
    prev = parent
 
    # Code for BFS
    while (len(q) > 0) :
         
        # Size of queue
        s = len(q)
        while (s > 0) :
            s = s - 1
             
            # Front most node in
            # the queue
            curr = q[0]
            q.pop(0)
 
            # Base case
            if (curr == None):
                continue
            prev.right = curr
            prev.left = None
            prev = curr
 
            # appending elements
            # in queue
            q.append(curr.left)
            q.append(curr.right)
         
    prev.left = None
    prev.right = None
 
# Function to print flattened
# Binary Tree
def print_(parent):
 
    curr = parent
    while (curr != None):
        print( curr.data , end=" ")
        curr = curr.right
 
# Driver code
root = node(1)
root.left = node(5)
root.right = node(2)
root.left.left = node(6)
root.left.right = node(4)
root.right.left = node(9)
root.right.right = node(3)
 
# Calling required functions
flatten(root)
print_(root)
     
# This code is contributed by Arnab Kundu

C#

// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG
{
     
// Node of the Binary tree
public class node
{
    public int data;
    public node left;
    public node right;
    public node(int data)
    {
        this.data = data;
        left = null;
        right = null;
    }
};
 
// Function to flatten Binary tree using
// level order traversal
static void flatten(node parent)
{
    // Queue to store nodes
    // for BFS
    Queue<node> q = new Queue<node>();
    q.Enqueue(parent.left);
    q.Enqueue(parent.right);
    node prev = parent;
 
    // Code for BFS
    while (q.Count > 0)
    {
         
        // Size of queue
        int s = q.Count;
        while (s-- > 0)
        {
             
            // Front most node in
            // the queue
            node curr = q.Peek();
            q.Dequeue();
 
            // Base case
            if (curr == null)
                continue;
            prev.right = curr;
            prev.left = null;
            prev = curr;
 
            // Pushing new elements
            // in queue
            q.Enqueue(curr.left);
            q.Enqueue(curr.right);
        }
    }
    prev.left = null;
    prev.right = null;
}
 
// Function to print flattened
// Binary Tree
static void print(node parent)
{
    node curr = parent;
    while (curr != null)
    {
        Console.Write(curr.data + " ");
        curr = curr.right;
    }
}
 
// Driver code
public static void Main(String[] args)
{
    node root = new node(1);
    root.left = new node(5);
    root.right = new node(2);
    root.left.left = new node(6);
    root.left.right = new node(4);
    root.right.left = new node(9);
    root.right.right = new node(3);
 
    // Calling required functions
    flatten(root);
    print(root);
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
// Javascript implementation of the approach
 
// Node of the Binary tree
class node
{
    constructor(data)
    {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
 
// Function to flatten Binary tree using
// level order traversal
function flatten(parent)
{
    // Queue to store nodes
    // for BFS
    let q = [];
    q.push(parent.left);
    q.push(parent.right);
    let prev = parent;
   
    // Code for BFS
    while (q.length > 0)
    {
           
        // Size of queue
        let s = q.length;
        while (s-- > 0)
        {
               
            // Front most node in
            // the queue
            let curr = q.shift();
             
   
            // Base case
            if (curr == null)
                continue;
            prev.right = curr;
            prev.left = null;
            prev = curr;
   
            // Pushing new elements
            // in queue
            q.push(curr.left);
            q.push(curr.right);
        }
    }
    prev.left = null;
    prev.right = null;
}
 
// Function to print flattened
// Binary Tree
function print(parent)
{
    let curr = parent;
    while (curr != null)
    {
        document.write(curr.data + " ");
        curr = curr.right;
    }
}
 
// Driver code
let root = new node(1);
root.left = new node(5);
root.right = new node(2);
root.left.left = new node(6);
root.left.right = new node(4);
root.right.left = new node(9);
root.right.right = new node(3);
 
// Calling required functions
flatten(root);
print(root);
 
// This code is contributed by avanitrachhadiya2155
</script>

Producción : 
 

1 5 2 6 4 9 3 

Complejidad de tiempo: O(N) 
Complejidad de espacio: O(N) donde N es el tamaño del árbol binario.
 

Publicación traducida automáticamente

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