```
def width_of_binary_tree(root)
return 0 if root.nil?
root.val = 0
curr_nodes = [root]
max_width = 0
while(!curr_nodes.empty?) do
max_width = [curr_nodes.last.val - curr_nodes.first.val + 1, max_width].max
children = []
curr_nodes.each do |node|
if node.left
node.left.val = node.val * 2
children << node.left
end
if node.right
node.right.val = node.val * 2 + 1
children << node.right
end
end
curr_nodes = children
end
max_width
end
```

The trick here is we want to find the min and max index of each level array to calculate that level's width. We do this by storing the index of each node into it's value. We multiply left by 2 and right by 2 + 1 (instead of the classic 2 + 1, 2 + 2 because we want each level array to start at 0.