2018年2月7日 星期三

[239] Sliding Window Maximum

Hard程度的題目!
估且不論執行速度
竟然比之前寫的都快都正確!(是和我個人比起來Orz)
感動 !!!!!!

就是說給一個array, 還有一個長度k的window
當這個window由左至右滑動時
記錄下當時window裡的最大值
回傳這組最大值.

Sliding Window Maximum
/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {
    if(nums == NULL || numsSize==0)
        return NULL;
    *returnSize = (numsSize -k)+1;
    int* ret = malloc(sizeof(int)*(*returnSize));
    int max=0;
    
    for(int i=0;i<(*returnSize);i++)
    {
        max=nums[i];
        for (int s=i;s<i+k;s++)
        {
            if(nums[s]> max)
                max = nums[s];
        }
        ret[i]=max;
    }
    return ret;
}

據說正解是什麼Sliding Window Minimum / Monotonic Queue的
但不知道為什麼現在無法思考 囧
睡前再來冥想看它是怎麼回事
先降~(揮手下降)

[20240714] update

發現以前寫的,以現在的測資去測根本就會超時啊哈哈哈哈哈XDDDD
怎麼會這樣= =+ 
重新寫的以為有加到速,看來是沒有 XD 但還是先貼一下
會不會再回來寫Monotonic Queue , let's wait and see XD

int findMax (int* nums, int start, int end, int numsSize)
{
int ret = INT_MIN;
for (int i=start; i <= end;i++)
{
if (nums[i]>ret)
ret= nums[i];
}
return ret;
}
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {
*returnSize = numsSize-k+1;
int *ret = calloc (*returnSize, sizeof(int));
if (k==1)
return nums;
int tmpMax = findMax(nums, 0, k-1, numsSize);
int idx=0;
ret[idx] = tmpMax; // we will increse idx later: after use it as left pointer
for (int i=k;i<numsSize;i++)
{
int new = nums[i];
int oldMax = ret[idx];
if (new <oldMax && nums[idx]!= oldMax)
ret[++idx] = oldMax;
else if (new >oldMax)
ret[++idx] = new;
else //(new <oldMax && nums[k]== oldMax)
ret[++idx] = findMax(nums, idx, idx+k, numsSize);
}
return ret;
}

[20251004]
喔我竟然有回來把hard TBC清掉的一天XD
驀然回首發現我前面兩次寫的都是暴力解啊哈哈哈哈哈跟Monotonic Queue + dequeue一點關係都沒有啊~~~~(國劇甩頭)
還有什麼priority queue是不是,那根本是用C 沒辦法寫的東西啊!
C++真是太偷吃步了,怎麼可以這樣!!!
至於DP (?) 什麼左邊算過來右邊算過來 我實在是看不懂Orz
就來句當年的, 有想到再來冥想看它是怎麼回事XDDDD 以上.
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {
*returnSize = numsSize -k +1;
if (k==1)
return nums;
int *ret = calloc (*returnSize,sizeof(int));
ret[0]=nums[0];
int *m_stack= calloc (numsSize, sizeof(int));
int top = -1;
int dequeue=-1;
m_stack[++top] = 0; //index
int idx=0;
int movehead=top;
for (int i=1; i<numsSize; i++)
{
if (i>=k) // check dequeue
{
#if 1
if (i- m_stack[movehead] >=k)
movehead++;
#else
if (i- m_stack[0] >=k) //會超時的依序copy
{
for (int j=0; j< top;j++)
m_stack[j]=m_stack[j+1];
top--;
}
#endif
}
//insert to m_stack
while (top>=movehead && nums[i]> nums[m_stack[top]])
top--;
m_stack[++top] = i;
if (i >= k-1)
{
ret[idx++]=nums[m_stack[movehead]];
}
}

return ret;
}


[46] Permutations

排列組合...
不知道為什麼完全沒有sense 囧
各種寫不出來 囧
還有就是
用C寫的人真的那麼少嗎嗎嗎嗎嗎(抱頭)

假會的N階function 好像反而慢XD
用一個for其實也才兩行Orz
是怎樣~我就是沒天份啦(奔入雨中)

結束的地方總覺得哪裡怪怪的 (是哪裡)
原來終止的時候就是整個array複製下來輸出的時候 @__@
光是把pointer array弄去遞迴再傳回來就覺得快使惹
為什麼我不開開心心的去喝咖啡吃蛋糕,
再隨便找個不需要考演算法的工作就好了呢?!
(話雖這麼說, 我這麼自虐寫leetCode,
讓我面上好嗎讓我面上好嗎請發我offer啊啊啊啊啊啊啊啊~~~~(各種鬼叫))

Permutations
/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int factorial(int input)
{
    if (input ==1)
        return 1;
    return input * factorial(input-1) ;
}

void swap(int *a,int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
    return;
}

void mypermute(int* nums,int index,int** ret, int numsSize, int *retIndex)
{
    int k;

    if(index == numsSize-1)
    {
#if 0   //mine
        for (int j=0; j<numsSize; j++)
        {
            ret[*retIndex][j] = nums[j];
        }
        *retIndex= *retIndex+1;      
#else
        memcpy(ret[(*retIndex)++], nums, (numsSize) * sizeof(int));
#endif
        return;
    }
    
    for(k=index;k<numsSize;k++)
    {
        swap(&nums[index], &nums[k]);
        mypermute(nums,index+1, ret, numsSize, retIndex);
        swap(&nums[index], &nums[k]);
    }
    return;
}

int** permute(int* nums, int numsSize, int* returnSize) {
    int i;
#if 0   //mine
    *returnSize = factorial(numsSize);
#else
    *returnSize =1;
    for(i = numsSize; i > 1; i--)  
    {  
        (*returnSize) *= i;  
    }  
#endif
    
    int **ret = malloc(sizeof(int*)*(*returnSize));
    for (i=0;i<(*returnSize);i++)
    {
        ret[i] = malloc(sizeof(int)*(numsSize));
    }

    int retIndex = 0;
    mypermute(nums, 0, ret, numsSize,&retIndex);

    return ret;
}

20230714 更新
多年以後,input 不知道為什麼多了一個感覺沒什麼用的 returnColumnSizes?! (thinking 圖)
可能是為了統一用在一些回傳的 int**會有不同size的情況吧?!(thinking圖again)
覺得已經腦死,我已經不會寫code了,我連階乘都寫不出來了........

/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int factorial(int size)
{
if (size==1)
return 1;
return size * factorial(size-1);
}

void swap(int *a, int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
return;
}

void myPermute(int* nums,int numsSize, int *curr, int start, int end, int **ret)
{
if (start == end)
{
memcpy(ret[(*curr)++],nums,sizeof(int)*numsSize);
return;
}
for (int j=start;j<=end;j++)
{
swap(&nums[start],&nums[j]);
myPermute(nums,numsSize,curr,start+1,end,ret);
swap(&nums[start],&nums[j]);
}
return;
}

int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int count= factorial(numsSize);
*returnSize = count;
int **ret = malloc(sizeof(int*)* (count));
*returnColumnSizes= malloc (sizeof(int)*(count));
for (int i=0;i<(count);i++)
{
ret[i]=malloc(sizeof(int)*numsSize);
(*returnColumnSizes)[i]= numsSize;
}
count=0;
myPermute(nums, numsSize,&count,0,numsSize-1,ret);
return ret;
}
#if 0

=> 1,2,3,4
1,(2,3,4)
2,(1,3,4)
3,(1,2,4)
4,(2,3,4)

=> 1,2,3
1,(2,3)
2,(1,3)
3,(1,2)

=> 1,2
1,(2)
2,(1)

=>
1
#endif

[56] Merge Intervals

雖然完全是一個不能被接受的慢Orz
但畢竟是我寫的啊啊啊就像我的孩子一樣啊啊啊~~~~~
這個題目描述的太簡單了QQ 有很多疑問
不確定輸入的資料究竟會如何
兩兩一組的array, 要把重疊的部分merge起來
最後輸出merge完以後的兩兩一組的array
(有解釋跟沒解釋一樣 XD)
但總而言之
寫到中等難度就要花掉一天,
我怎麼不去賣雞排呢?

Merge Intervals
/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 * };
 */
/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
void mySort(int* array, int size)
{
    int i,tmp;
    for(i=size;i>0;i--)
    {
        if(array[i] < array[i-1])
        {
            tmp = array[i];
            array[i] = array[i-1];
            array[i-1] = tmp;
        }
        else
            break;
    }
}

struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
    if(intervals == NULL || intervalsSize== 0)
        return;
    struct Interval* ret = malloc(sizeof(struct Interval) * intervalsSize);
    *returnSize = 0;
    int* start = malloc(sizeof(int) * intervalsSize);
    int* end = malloc(sizeof(int) * intervalsSize);
    for(int i=0;i<intervalsSize;i++)
    {
        start[i] = intervals[i].start;
        end[i] = intervals[i].end;
        mySort(start,i);
        mySort(end,i);
    }
    int istart=0;
    int iend=0;
    int flag = 0;

    ret[*returnSize].start = start[istart++];

    while (iend < intervalsSize)
    {
        if (start[istart] <= end[iend])
        {
            istart++;
            iend++;
            continue;
        }

        if (istart==intervalsSize)
            break;

        if (end[iend] <= start[istart])
        {
            ret[*returnSize].end =end[iend++];
            *returnSize=*returnSize +1;            
            ret[*returnSize].start =start[istart++];
        }                    
    }

    ret[*returnSize].end = end[intervalsSize-1];
    *returnSize=*returnSize +1;            

    return ret;
}

結果我只是慢在sorting 嗎QQ
就自以為大致上會從小到大input
所以用insertion sort 很快之類的
蠢 !!!
把sort改成 qsort就快很多了 QQ

int cmp(const void *a , const void *b)
{
    return *(int *)a - *(int *)b;
}

    qsort(start, intervalsSize, sizeof(int), cmp);
    qsort(end, intervalsSize, sizeof(int), cmp);
原來自己還沒有笨的太誇張QQ
覺得安慰 QQ

2018年2月6日 星期二

[605] Can Place Flowers

有一個array只有0跟1, 想成是花瓶, 0表示沒花, 1表示有
相鄰的不能都插花, 必須間隔一個以上;
頭的左邊跟尾的右邊可以當做0.
給n枝花, 請回傳是放的下還是放不下~~~~

感覺是一個很有趣的題目
可是我怎麼都寫不好呢~(哭)
下面算是針對測資寫到過的概念
好像不一該貼出來啊啊啊因為實在太丟臉了啊啊啊啊啊~~~~~~
Can Place Flowers
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
    int *stack = malloc(sizeof(int)*flowerbedSize);
    int i,j,index=0;

    if (flowerbedSize == 1 && flowerbed[0]==0)
        return true;

    if (flowerbedSize == 2 && flowerbed[0]==0 && flowerbed[1]==0  && n==1)
        return true;

    for (i=0;i<flowerbedSize;i++)
    {
        if (flowerbed[i] == 0)
        {
            stack[index++] = 0;
        }
        else
        {
            if(index==2 && stack[0]==0 && stack[1]==0)
            {
                index -=2;
                n--;  
            }

            while((index-3)>=0)
            {
                if (stack[index-2]==1)
                    break;
                if (stack[index-3]==1)
                {
                    index -=2;
                }
                else if(stack[index-3]==0 && stack[index-2]==0 && stack[index-1]==0)
                {
                    index-=2;
                    n--;
                }
                else
                    break;
            }
           
            if(index==2 && stack[0]==0 && stack[1]==0)
            {
                index -=2;
                n--;  
            }
            stack[index++] = 1;
        }      
    }

    while((index-2)>=0)
    {
        if(stack[index-2]==0 && stack[index-1]==0)
        {
            index-=2;
            n--;
        }
        else
            break;
    }

    if(index==1 && stack[0]==0)
    {
        index -=2;
        n--;  
    }

    return (n<=0)? true:false;
   
}

後來覺得怎麼想都不對QQ
(因為怎麼寫都不對哈哈哈)
才發現原來用數的就可以了 QQ
我又想的太難了啊啊啊~~~(奔入雨中)

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
    int i,zerocount = 1;
    for (i=0;i<flowerbedSize;i++)
    {
        zerocount = (flowerbed[i]==0) ? (zerocount+1) :0;
        if(zerocount==3)
        {
            zerocount=1;
            n--;
        }
    }
    if (zerocount==2)
        n--;
    return n<=0?(true):(false);
}

2018年2月5日 星期一

[190] Reverse Bits

將一個數字以bit欄位反轉....
我真懷疑我是念資工系的Orz
(大哭)

Reverse Bits
uint32_t reverseBits(uint32_t n) {
    int i;
    uint32_t new=0,org=0;
    for(i=0;i<16;i++)
    {
        org = (1<<i & n);
        new = new | (org | 0) << (31-i*2);
    }
    for(i=0;i<16;i++)
    {
        org = (1<<(i+16) & n);
        new = new | (org | 0) >> (1+i*2);
    }
    return new;
}
別人寫的code 好漂釀啊
我寫的為什麼那麼醜呢 XD
欲哭無淚啊嘆氣

[20260208 更新]
為什麼可以這樣寫啊哈哈哈!
為什麼要先把result 往左移一格啊!為什麼不是加完再移呢!
啊~~~~~~(倒地)
int reverseBits(int n) {
int output = 0;
for (int i=0; i<32; i++)
{
output <<= 1;
bool check =n& 0x1;
if (check)
output |= 1;
n= n>>1;
}
return output;
}

2018年2月4日 星期日

[160] Intersection of Two Linked Lists

總是想要先寫出來再說......
好像不是一個好習慣 ?!

[143] Reorder List

要重新排列linked list
例如 : 1,2,3,4,5,6
要排成 : 1,6,2,5,3,4
真囉唆XD
照著直觀的解釋下去解,得到了18xx ms 的傲人成績!!!
(根本就是超過time limit 的邊緣 XD~)
於是就想到了可以切一半的作法;
沒想到還是不夠 囧
看別人講的, 還要再給它reverse 一下最後組回去才是相對快的解法
唉我還是奔入雨中吧.............

超出時間版
Reorder List
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
void reorderList(struct ListNode* head) {
    if (head == NULL)
        return;
    if (head->next == NULL)
        return;
    if (head->next->next == NULL)
        return;
    struct ListNode *end, *ptr, *pcur, *ppre;
    pcur = head;
    
    while(pcur->next != NULL && pcur->next ->next != NULL)
    {
        for(ppre = head, ptr = head -> next; ptr->next != NULL;ppre=ppre->next, ptr = ptr->next)
            ;
        ppre->next = NULL;
        end = ptr;
        end->next = pcur->next;
        pcur->next = end;
        pcur = end->next;
    }
}
不過呢, 以往linked list都要寫很久的我,
這題倒是沒卡關很久
雖然超時了哈哈但是還是蠻欣慰的QQ
(廢啊這孩子XD)

所以就直接給它切一半, 但是反骨不想做reverse:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
void reorderList(struct ListNode* head) {
    if (head == NULL)
        return;
    if (head->next == NULL)
        return;
    if (head->next->next == NULL)
        return;
    struct ListNode *end, *ptr, *pcur, *ppre,*middle;
    pcur = head;
    int i,count=0;
    for(ptr = head;ptr->next != NULL;ptr= ptr->next)
    {
        count++;
    }
    for(ptr = head,i=0;i<(count/2);ptr= ptr->next, i++)
    ;
    middle = ptr;
    
    while(pcur->next != NULL && pcur->next ->next != NULL)
    {
        for(ppre = middle, ptr = middle -> next; ptr->next != NULL;ppre=ppre->next, ptr = ptr->next)
            ;
        ppre->next = NULL;
        end = ptr;
        end->next = pcur->next;
        pcur->next = end;
        pcur = end->next;
    }
}
這樣時間已經快了四倍有 囧
有閒情逸致再來做反轉版Orz

20240525 update
說好的reverse版本XD

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverse(struct ListNode* head)
{
struct ListNode *pre, *cur,*next;
pre = NULL;
cur = head;
while(cur != NULL)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}

return pre;
}

void reorderList(struct ListNode* head) {
if (head == NULL || head->next == NULL)
return;
struct ListNode *fast, *slow, *pre;
fast= head;
slow= head;
pre = NULL;
while (fast != NULL )
{
fast = fast->next;
if (fast != NULL)
fast = fast->next;
pre= slow;
slow = slow->next;
}
pre->next= NULL;
fast = reverse(slow);//later half head
slow = head; // just a pointer
while (slow != NULL)
{
struct ListNode* p1 = slow->next;
slow->next = fast;
if (fast->next == NULL)
{
fast->next = p1;
break;
}
struct ListNode* p2 = fast->next;
fast->next = p1;
fast= p2;
slow =p1;
}
}

[165] Compare Version Numbers

比對版本號again~~~~~
後面通通都帶零的話也算是合法輸入,
是想逼死誰~~~~~~~
(對啦我就是只會笨解法, 哭)

Compare Version Numbers
int compareVersion(char* version1, char* version2) {
    char *p1, *p2, *pp1, *pp2;
    char buf1[20],buf2[20];
    int v1,v2;
    bool e1=0,e2=0;
    pp1 = version1;
    pp2 = version2;
    while(e1!=1 || e2!=1)
    {
        if (e1)
        {
            v1 = 0;
        }
        else
        {
            memset(buf1,0,20);
            p1 = strstr(pp1,".");
            if (p1 != NULL)
            {
                strncpy(buf1, pp1, (p1-pp1));
                v1 = atoi(buf1);
            }
            else
            {
                e1 = 1;
                v1 = atoi(pp1);      
            }
        }
        if (e2)
        {
            v2 = 0;
        }
        else
        {        
            memset(buf2,0,20);
            p2 = strstr(pp2,".");
            if (p2 != NULL)
            {
                strncpy(buf2, pp2, (p2-pp2));
                v2 = atoi(buf2);
            }
            else
            {
                e2 = 1;
                v2 = atoi(pp2);      
            }
        }
        if (v1 > v2)
            return 1;
        else if (v1 < v2)
            return -1;

        if (!e1)
            pp1 = p1+1;
        if (!e2)
            pp2 = p2+1;
    }
    return 0;
   
}

[448] Find All Numbers Disappeared in an Array


找出array裡少掉的數字, 回傳它的index
一開始的想法好像會用掉很多memory
看完別人的解法就覺得自己是凡人, 哈哈哈

Find All Numbers Disappeared in an Array
/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
    int* ret = malloc(sizeof(int)*(numsSize+1));
    int i;
    for (i=0;i<numsSize;i++)
    {
        ret[nums[i]] = 1;
    }
    
    for(i=1;i<=numsSize;i++)
    {
        //printf("%d: %d\n",i, ret[i]);
        if(ret[i]!=1)
        {
            ret[*returnSize] = i;
            *returnSize += 1;
        }
    }
    return ret;
}

[102] Binary Tree Level Order Traversal

狀況很差
莫再提 T__T
有機會的話用add queue的方式寫一次看看 QQ


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *columnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) {
    struct TreeNode *queue[10000];
    int i=0;
    int **retArray = malloc(sizeof(int *)*10000);
    *columnSizes = malloc(sizeof(int *)*10000);

    *returnSize=0;
    if(root == NULL)
        return retArray;
    struct TreeNode* ptr = root;
    int head=0;
    int tail=1;
    queue[head]= root;
    int level = 0;
    int nextcount = 0,  cur_count=1;
    while(head < tail/*ptr != NULL*/)
    {
        retArray[level] = malloc(sizeof(int) * 10000);
        for (i=0;i<cur_count && head < tail;i++)
        {
            if(ptr->left!=NULL)
            {
                queue[tail++]=ptr->left;
                nextcount++;
            }
            if(ptr->right!=NULL)
            {
                queue[tail++]=ptr->right;
                nextcount++;
            }
            retArray[level][i] = ptr->val;

            ptr = queue[++head];
        }

        (*columnSizes)[level++] = cur_count;
        cur_count = nextcount;
        nextcount = 0;
    }
    *returnSize=level;  
    return retArray;
}

20240616 更新
這個寫的好漂亮喔QQ
但pointer 之間的傳遞怎麼那麼麻煩啊哈哈(乾笑)
結果還是沒有用queue 來寫(?) 
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int dfs(struct TreeNode* root, int cur)
{
if (root == NULL)
return cur;
int left = dfs(root->left , cur +1);
int right = dfs(root->right , cur +1);
return (left > right) ? (left):(right);
}

void bfs(struct TreeNode* root,int **ret,int *column, int level)
{
if (root== NULL)
return;
ret[level][column[level]] = root->val;
(column[level])++;
bfs(root->left,ret, column, level+1);
bfs(root->right,ret, column, level+1);
}

int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {
int depth= dfs(root,0);
int **ret = calloc (depth, sizeof(int*));
(*returnColumnSizes) = calloc (depth, sizeof(int));
for (int i=0; i<depth; i++)
ret[i] = calloc (1024, sizeof(int));

bfs(root,ret,(*returnColumnSizes),0);
*returnSize = depth;
return ret;
}

再次更新,原來是有用queue寫XD 只是寫的不美麗(?)
既然都想要先求個深度(高度)了,就順便算一下有幾個node 好了 XD
然後克服了 : 是pointer array 的queue,指向每個node,還有每個 level 要去紀錄它們有幾個node之後,突然覺得自己的queue寫的很漂亮吶!!!(哈哈哈大頭症笑)我又感受到自己的進步了,我要哭了嗚嗚嗚嗚嗚嗚
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int dfs(struct TreeNode* root, int cur, int *count)
{
if (root == NULL)
return cur;
(*count) +=1;
int left = dfs(root->left , cur +1, count);
int right = dfs(root->right , cur +1, count);
return (left > right) ? (left):(right);
}
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {
if (root == NULL)
{
*returnSize = 0;
return NULL;
}
int count=0;
int depth= dfs(root,0, &count);
int **ret = calloc (depth,sizeof(int*));
(*returnColumnSizes) = calloc (depth, sizeof(int));
for (int i=0; i< depth; i++)
ret[i] = calloc (count/2+1, sizeof(int));

struct TreeNode** queue= calloc (count+1, sizeof(struct TreeNode*));
int start=0, end=1,level=0,idx=0;
queue[idx++] = root;
while (start < end)
{
for (int i=start; i<end;i++)
{
struct TreeNode* ptr = queue[i];
ret[level][(*returnColumnSizes)[level]]=ptr->val;
(*returnColumnSizes)[level]++;
if (ptr->left != NULL)
queue[idx++] = ptr->left;
if (ptr->right != NULL)
queue[idx++] = ptr->right;
}
start = end;
end = idx;
level++;
}
*returnSize = depth;
return ret;
}