level_order_traversal modified version.

# Node class definition
class Node:
    def __init__(self, val=None, left=None, right=None, next=None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
 
# function to connect nodes at same level
def connect(root):
    # return if root is None
    if not root:
        return root
    
    # initialize queue with root node
    queue = [root]
    
    # traverse tree level by level
    while queue:
        # get size of current level
        level_size = len(queue)
        
        # process all nodes at current level
        for i in range(level_size):
            # dequeue node from queue
            node = queue.pop(0)
            
            # connect node to next node at same level
            if i < level_size - 1:
                node.next = queue[0]
            
            # enqueue left and right child of current node
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
    
    return root
 
# create example binary tree
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
 
# connect nodes at same level
connect(root)
 
# print next pointers of each node
print(root.val, root.next)
print(root.left.val, root.left.next.val)
print(root.left.left.val, root.left.left.next.val, root.left.left.next.next.val)
print(root.left.right.val, root.left.right.next.val, root.left.right.next.next.val)
print(root.right.left.val, root.right.left.next.val, root.right.left.next.next.val)
print(root.right.right.val, root.right.right.next)