429.N叉树的层序遍历

题目描述

给定一个 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;i<count;i++){
            struct Node* cur=queue[head++];
            ans[level][i]=cur->val;//将该结点的数据域放入二维数组后依次将其孩子结点入队
            for(int j=0;j<cur->numChildren;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;i<count;i++){
            struct TreeNode* cur=queue[head++];
            ans[level][i]=cur->val;
            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语言解决这种问题时,了解了相应的参数的意义以及书写的格式。希望能在以后的学习中多一分热爱,多一分进步。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值