Recorrido de orden de nivel de Binary Tree usando Morris Traversal

Dado un árbol binario , la tarea es atravesar el árbol binario en orden de niveles .
Ejemplos: 
 

Input: 
         1
        / \
       2   3
Output:
1
2 3

Input:
         5
        / \
       2   3
        \
         6
Output:
5
2 3
6

Enfoque: La idea es utilizar Morris Preorder Traversal para recorrer el árbol en orden de nivel transversal.
Observaciones: Hay principalmente dos observaciones para el recorrido del árbol utilizando el recorrido de preorden de Morris. Eso es – 
 

  • En el recorrido Preorder, los Nodes más a la izquierda de un nivel se visitan primero, por lo que se pueden usar para recorrer el árbol en orden de nivel.
  • Como mantenemos la distancia horizontal de los Nodes en la vista superior del árbol binario , de manera similar, si mantenemos el nivel del Node actual e incrementamos o disminuimos el nivel según el movimiento, entonces los Nodes se pueden atravesar fácilmente.

Al igual que en el recorrido en preorden de Morris, conectamos el Node más a la derecha del hijo izquierdo con su sucesor en orden para mantener el movimiento de modo que podamos volver al hijo derecho del Node padre después de explorar completamente el hijo izquierdo del padre. Por lo tanto, mientras nos movemos hacia el hijo más a la derecha del hijo izquierdo, podemos hacer un seguimiento del número del incremento en el nivel para calcular el sucesor del nivel en orden del hijo. 
A continuación se muestra la explicación del enfoque con la ayuda de un ejemplo: 
 

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

Python3

# Python implementation of the Level
# order traversal using Morris traversal
 
# Class of the node of the
# Binary Tree
class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
# Function to traverse the Binary
# tree in the Level Order Fashion
def levelOrderTraversal(root):
     
    # Current Node is marked as
    # the Root Node
    curr = root
    level = 0
 
    # Loop to traverse the Binary
    # Tree until the current node
    # is not Null
    while curr:
 
        # If left child is null, print the
        # current node data. And, update 
        # the current pointer to right child.
        if curr.left is None:
 
            # Return the current node with
            # its level
            yield [curr, level]
            curr = curr.right
            if curr:
                level += 1
            else:
                level -= 1
        else:
 
            # Find the inorder predecessor
            prev = curr.left
            to_up = 0
 
            # Loop to find the right most
            # node of the left child of the
            # current node
            while prev.right is not None and \
                    prev.right is not curr:
                prev = prev.right
                to_up += 1
 
            # If the right child of inorder
            # predecessor already points to
            # the current node, update the 
            # current with it's right child
            if prev.right is curr:
                prev.right = None
                curr = curr.right
                level -= to_up + 1
             
            # else If right child doesn't
            # point to the current node,
            # then print this node's data
            # and update the right child
            # pointer with the current node 
            # and update the current with
            # it's left child
            else:
                yield [curr, level]
                prev.right = curr 
                curr = curr.left
                level += 1
 
# Driver Code
if __name__ == "__main__":
    root = Node(5)
    root.left = Node(2)
    root.right = Node(3)
    root.left.right = Node(6)
 
    # Output List to store the
    # Level Order Traversed Nodes
    outputData = [[] for i in range(100)]
 
    for node, level in levelOrderTraversal(root):
        outputData[level].append(node.data)
 
    h = 0
 
    # Loop to find the height of the
    # Binary Tree
    for i in outputData:
        if i:
            h += 1
        else:
            break
 
    # Loop to print the Data
    for i in range(h):
        print(' '.join(map(str, outputData[i])))
Producción: 

5
2 3
6

 

Análisis de rendimiento: 
 

  • Complejidad de tiempo: como en el enfoque anterior, cada Node se toca como máximo dos veces, por lo que la complejidad de tiempo es O (N) , donde N es el número de Nodes.
  • Espacio auxiliar: como en el enfoque anterior, no se utiliza espacio adicional debido a que el espacio auxiliar utilizado será O(1)

Publicación traducida automáticamente

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