1. Code

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root == None:
            return []
        
        ans = [[root.val]]
        nodes = [root]
        cnt = 0

        parents = [[nodes[cnt]]]
        while True:
            children = []
            vals = []
            if len(parents) == cnt:
                break
            
            for parent in parents[cnt]:
                if parent.left:
                    children.append(parent.left)
                    vals.append(parent.left.val)
                if parent.right:
                    children.append(parent.right)
                    vals.append(parent.right.val)

            if children == []:
                return ans

            parents.append(children)
            ans.append(vals)
            cnt += 1

2. Result

        Runtime : 31 ms(96.47%), Memory usage : 14.1 MB(98.87%)
        (Runtime can be different by a system even if it is a same code.)

Check out the my GitHub repo for more info on the code. If you have questions, you can leave a reply on this post.