Solution
Approach #1 Recursive Solution[Accepted]
We start by initializing a array with the dimensions being x. Here, refers to the number of levels in the given tree. In order to fill this array with the required elements, initially, we fill the complete array with ""
. After this we make use of a recursive function fill(res, root, i, l, r)
which fills the array such that the current element has to be filled in row, and the column being the middle of the indices and , where and refer to the left and the right boundaries of the columns in which the current element can be filled.
In every recursive call, we do as follows:

If we've reached the end of the tree, i.e. if root==null, return.

Determine the column in which the current element() needs to be filled, which is the middle of and , given by say, . The row number is same as . Put the current element at .

Make the recursive call for the left child of the using
fill(res, root.left, i + 1, l, (l + r) / 2)
. 
Make the recursive call for the right child of the using
fill(res, root.right, i + 1, (l + r + 1) / 2, r)
.
Note, that in the last two recursive calls, we update the row number(level of the tree). This ensures that the child nodes fit into the correct row. We also update the column boundaries appropriately based on the and values.
Further, to determine the also, we make use of recursive funtion getHeight(root)
, which returns the height of the tree starting from the node. We traverse into all the branches possible in the tree recursively and find the depth of the longest branch.
At the end, we convert the array into the required list format, before returning the results.
Complexity Analysis

Time complexity : . We need to fill the array of size x. Here, refers to the height of the given tree.

Space complexity : . array of size x is used.
Approach #2 Using queue(BFS)[Accepted]
Algorithm
We can also solve the problem by making use of Breadth First Search's idea. For this, we make use of a class which stores the parameters of a of the tree, including its value, its level in the tree(), and the left() and right() boundaries of the columns in which this element can be filled in the result to be returned.
We start by initializing a array as in the previous approach. After this, we add the parametrized of the tree into a . After this, we do the following at every step.

Remove an element, $$p$, from the front of the .

Add this element at its correct position in the array given by . Here, the values , and refer to the column/level number, and the left and right boundaries permissible for putting the current node into . These are obtained from the node's parameters, which have been associated with it before putting it into the .

If the left child of exists, put it at the back of the , in a parametized form, by appropriately updating the level as the next level and the boundaries permissible as well.

If the right child of exists, put it at the back of the , in a parametized form, by appropriately updating the level as the next level and the boundaries permissible as well.

Continue steps 1. to 4. till the becomes empty.
At the end, we again convert the array into the required list format, before returning the results.
Complexity Analysis

Time complexity : . We need to fill the array of size x. Here, refers to the height of the given tree.

Space complexity : . array of size x is used.
Analysis written by: @vinod23