BFS with a queue. Grab the last node at each level.
function rightSideView(root):
if not root:
return []
result = []
queue = [root]
while queue:
levelSize = len(queue)
for i in range(levelSize):
node = queue.pop(0)
if i == levelSize - 1:
result.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return result
time, space.