给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
输入:root = [1,null,3,2,4,null,5,6] 输出:[[1],[3,2,4],[5,6]]来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
由于刚开始接触这种比较复杂的二级指针类的题目,我一开始都不明白题目所给形参的含义,后来发现其实并不难理解,其中root是指向树根结点的指针,returnSize记录树的层数,returnColumnSizes记录该树每一层有几个结点。
对于层序遍历只需要借助一个队列,当队列不空时,取队头元素访问其数据域,并依次将其孩子结点入队,直到队列为空,层序遍历结束。
#define MAX_LEVE_SIZE 1000 //最大层数
#define MAX_NODE_SIZE 10000 //最大结点数
int** levelOrder(struct Node* root, int* returnSize, int** returnColumnSizes) {
int** ans=(int**)malloc(sizeof(int*)*MAX_LEVE_SIZE);
*returnColumnSizes=(int*)malloc(sizeof(int)*MAX_LEVE_SIZE);
if(!root){
*returnSize=0;
return ans;
}
//队列
struct Node** queue=(struct Node**)malloc(sizeof(struct Node*)*MAX_NODE_SIZE);
int tail=0;
int head=0;
int level=0;
queue[tail++]=root;
while(tail!=head){
int count=tail-head;//记录当前层节点数
ans[level]=(int*)malloc(sizeof(int)*count);//为该层数据开辟空间
for(int i=0;ival;//将该结点的数据域放入二维数组后依次将其孩子结点入队
for(int j=0;jnumChildren;j++){
queue[tail++]=cur->children[j];
}
}
//将这一层存入的结点数记录到returnColumnSizes中
(*returnColumnSizes)[level++]=count;
}
*returnSize=level;
free(queue);
return ans;
}
由于返回值是一个二维数组,所以定义一个二级指针,指向一个由最大层数个的指针组成的数组,其中每一个数组元素都是一个指向该层元素的一维数组。
借助学到的知识,练习以下二叉树的层序遍历实现,相比于N叉树,二叉树的层序遍历过程相对容易,代码如下。
#define MAX 2000 //最大结点数为2000
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
int** ans=(int**)malloc(sizeof(int*)*MAX);
(*returnColumnSizes)=(int*)malloc(sizeof(int)*MAX);
if(!root){
*returnSize=0;
return ans;
}
//队列
struct TreeNode** queue=(struct TreeNode**)malloc(sizeof(struct TreeNode*)*MAX);
int tail=0;
int head=0;
int level=0;
queue[tail++]=root;
while(tail!=head){
int count=tail-head;
ans[level]=(int*)malloc(sizeof(int)*count);
for(int i=0;ival;
if(cur->left){
queue[tail++]=cur->left;
}
if(cur->right){
queue[tail++]=cur->right;
}
}
(*returnColumnSizes)[level++]=count;
}
*returnSize=level;
free(queue);
return ans;
}
与N叉树层序遍历的唯一区别就是在孩子结点入队时,N叉树需要写一个循环,判断上层结点的所有孩子结点是否存在,并入队,而二叉树只需要写两个if语句判断左右孩子是否存在,若存在,则左右孩子依次入队即可。
今天的收获还是非常多的,对于层序遍历的代码有了更深的理解,同时使用C语言解决这种问题时,了解了相应的参数的意义以及书写的格式。希望能在以后的学习中多一分热爱,多一分进步。