題目
給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。
示例:
二叉樹:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其層次遍歷結果:
[
[3],
[9,20],
[15,7]
]
方案:隊列
- 用隊列實現的,思路同Java版一模一樣,只不過隊列還得手撕實現~
#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 **levelOrder(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[iRetSize] = (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[iRetSize] = (int *)malloc(sizeof(int) * strQueue.iNum);
Push_Queue(&strQueue, NULL);
}
}
else
{
pRet[iRetSize][pRetCol[iRetSize]] = pTmpNode->val;
pRetCol[iRetSize] += 1;
if (NULL != pTmpNode->left)
{
Push_Queue(&strQueue, pTmpNode->left);
}
if (NULL != pTmpNode->right)
{
Push_Queue(&strQueue, pTmpNode->right);
}
}
}
*returnSize = iRetSize + 1;
*returnColumnSizes = pRetCol;
return pRet;
}
複雜度計算
- 時間複雜度:O(n),n表示二叉樹元素總個數,下同
- 空間複雜度:O(n)