二叉树的层序遍历用到广度优先搜索(BFS),二叉树的前中后序遍历一般用深度优先搜索(DFS)。
层序遍历:即将每一层的结点值遍历完,再进行下一层遍历。
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
输入:root = [1]
输出:[[1]]
一般对于BFS,我们都会借用其他数据结构的思想------队列的思想--->先进先出。
我们将每一层结点入队列,然后再将这层结点出队列,在出队列的同时,将该结点的左右孩子(不为空)入队列,那么当该层结点出队完时,下一层结点也入队列了。
我们用双指针front和rear来记录每一层结点的个数,并用此来记录入队列和出队列时结点在队列中的下标。这里出队列,我们只需要让front++即可。
// returnSize表示树的深度(层数)
// returnColumnSizes是一个一维数组的指针,该数组中存放每一层结点的个数
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {
*returnSize = 0;//深度初始化为0
if(root == NULL)//判空
return NULL;
int** ans = (int**)malloc(sizeof(int*)*2001);//开辟存放结点的数组
*returnColumnSizes = (int*)malloc(sizeof(int)*(2001));//开辟returnColumnSizes
struct TreeNode* que[2001];//模拟队列,存放的是结点的地址
int front = 0,rear = 0;//双指针
que[rear++] = root;//先将根节点入队
while(front != rear)//结束条件:front == rear,即空树,rear-front代表每层结点个数
{
ans[(*returnSize)] = (int*)malloc(sizeof(int)*(rear-front));//开辟ans的每一层
(*returnColumnSizes)[(*returnSize)] = rear-front;//每层结点个数入数组
int start = front;//记录front,便于将每层结点的val入ans数组
front = rear;//front变为rear,即下一层的开始,也代表该层出队
for(int i = start;i<front;i++)//start到front,即front到rear,入ans数组
{
ans[(*returnSize)][i-start] = que[i]->val;//入ans数组
if(que[i]->left)//下一层入队
que[rear++] = que[i]->left;
if(que[i]->right)//下一层入队
que[rear++] = que[i]->right;
}
(*returnSize)++;//层数++
}
return ans;
}