題目
給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)
例如:
給定二叉樹 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的層次遍歷爲:
[
[15,7],
[9,20],
[3]
]
方案:
#define MAX_LEVEL 1000
struct QueueNode
{
struct TreeNode *pTreeNode;
struct TreeNodeQueue *pNext;
};
struct TreeNodeQueue
{
int iNum;
struct QueueNode *pHead;
struct QueueNode *pTail;
};
bool Push_Queue(struct TreeNodeQueue *pQueue, struct TreeNode *pTreeNode)
{
struct QueueNode *pQueueNode = NULL;
if (NULL == pQueue)
return false;
pQueueNode = (struct QueueNode *)malloc(sizeof(struct QueueNode));
pQueueNode->pTreeNode = pTreeNode;
pQueueNode->pNext = NULL;
if (0 == pQueue->iNum)
{
pQueue->pHead = pQueueNode;
pQueue->pTail = pQueueNode;
pQueue->iNum += 1;
}
else
{
pQueue->pTail->pNext = pQueueNode;
pQueue->pTail = pQueueNode;
pQueue->iNum += 1;
}
return true;
}
struct TreeNode *Pop_Queue(struct TreeNodeQueue *pQueue)
{
struct TreeNode *pRet = NULL;
struct QueueNode *pTmp = NULL;
if ((NULL == pQueue) || (0 == pQueue->iNum))
return NULL;
pRet = pQueue->pHead->pTreeNode;
pQueue->iNum -= 1;
if (0 == pQueue->iNum)
{
free(pQueue->pHead);
pQueue->pHead = NULL;
pQueue->pTail = NULL;
}
else
{
pTmp = pQueue->pHead->pNext;
free(pQueue->pHead);
pQueue->pHead = pTmp;
}
return pRet;
}
int** levelOrderBottom(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
int iNum = 0;
int iRetSize = 0;
int** pRet = NULL;
int* pRetCol = NULL;
struct TreeNodeQueue strQueue;
struct TreeNode* pTmpNode = NULL;
pRet = (int**)malloc(sizeof(int*) * MAX_LEVEL);
memset(pRet, 0x00, sizeof(int*) * MAX_LEVEL);
pRetCol = (int*)malloc(sizeof(int) * MAX_LEVEL);
memset(pRetCol, 0x00, sizeof(int) * MAX_LEVEL);
memset(&strQueue, 0x00, sizeof(struct TreeNodeQueue));
if(NULL == root)
{
*returnSize = iRetSize;
*returnColumnSizes = pRetCol;
return pRet;
}
Push_Queue(&strQueue, root);
pRet[MAX_LEVEL - iRetSize - 1] = (int*)malloc(sizeof(int) * strQueue.iNum);
Push_Queue(&strQueue, NULL);
while(strQueue.iNum != 0)
{
pTmpNode = Pop_Queue(&strQueue);
if(NULL == pTmpNode)
{
if(0 != strQueue.iNum)
{
iRetSize += 1;
pRet[MAX_LEVEL - iRetSize - 1] = (int*)malloc(sizeof(int) * strQueue.iNum);
Push_Queue(&strQueue, NULL);
}
}
else
{
pRet[MAX_LEVEL - iRetSize - 1][pRetCol[MAX_LEVEL - iRetSize - 1]] = pTmpNode->val;
pRetCol[MAX_LEVEL - iRetSize - 1] += 1;
if(NULL != pTmpNode->left)
{
Push_Queue(&strQueue, pTmpNode->left);
}
if(NULL != pTmpNode->right)
{
Push_Queue(&strQueue, pTmpNode->right);
}
}
}
*returnSize = iRetSize + 1;
*returnColumnSizes = &pRetCol[MAX_LEVEL - iRetSize - 1];
return &pRet[MAX_LEVEL - iRetSize - 1];
}
複雜度計算