The idea is straightforward,
- calculate the height, so the column n will be pow(2, h)-1
- for each row, it will have count=pow(2, i) numbers so each number will take n / count space, because we need to put them in the middle of their space so the first of each row postion is n / count / 2, the next one will be n / count / 2 + n / count + 1 on the right side, then next next is n / count / 2 + n / count + 1 + n / count + 1 .... so we can conclude the position of number j in each row is: n / count / 2 + j * (n / count + 1) here each time add 1 because their direct parent will take up one space (see problem example 1, 2nd row is '2', '', '', the middle '' is taken by previous '1'
- just put the number in their position and append each row to the final result
class Solution(object): def getHeight(self, root): if root is None: return 0 return 1 + max(self.getHeight(root.left), self.getHeight(root.right)) def printTree(self, root): """ :type root: TreeNode :rtype: List[List[str]] """ res =  h = self.getHeight(root) n = pow(2, h) - 1 q = [root] for i in range(0, h): lvl = [''] * n count = pow(2, i) for j in range(0, count): top = q.pop(0) pos = j * (n / count + 1) + n / count / 2 val = '' left = None right = None if top is not None: val = str(top.val) left = top.left right = top.right lvl[pos] = val q.append(left) q.append(right) res.append(lvl) return res