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)