102. 二叉树的层序遍历(逻辑与104.二叉树的深度 相近)(自己写的题解,方便自己回忆复习)

102. 二叉树的层序遍历(逻辑与104.二叉树的深度 相近)

难度中等
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 

示例 1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aAJbmBFm-1677138027745)(en-resource://database/624:1)]
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:输入:root = [1]

输出:[[1]]

示例 3:输入:root = []

输出:[]
 

思路:

借助队列完成
  • 让根入队,然后将根出队,放入数组内,然后让根的左孩子,右孩子依次放进队列;
  • 之后每从队列里出队一个元素(放入用来存储的数组中),就让该元素的左孩子,右孩子依次入队
  • 直到队列为空,完成了层序遍历(由于这道题需要以二维数组的形式输出,情况相对更加复杂,所以还需要在每一层出队完之后将下一层的元素放入第下一列数组中,利用一个last巧妙地存放每一层的最后一个元素在队列里的位置,当该层元素出队完之后再挪动last的位置到新入队的最后一个元素的位置,然后重新为下一层的元素分配新一层的数列)

队列情况

3
920
201517
1517
17

数组情况

3
39
3920
392015
39201517

我的代码


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
 //returnSize是二维数组的层数,returnColumnSizes是一个存放每一层树的元素个数的二维数组(但当一维数组使用)
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    *returnSize=0;
    if(root==NULL)
    {
        return NULL;
    }
    int**res=(int**)malloc(sizeof(int*)*2000);//为返回的数组创建空间
    *returnColumnSizes=(int**)malloc(sizeof(int*)*2000);//为returnColumnSizes分配层数
    struct TreeNode*QUEUE[2000];//创建队列
    int front=0;//指向队列的第一个元素
    int rear=1;//指向队列的最后一个元素
    struct TreeNode* out;//存放出队的元素的数据,方便放入数列中(或者也可以先放入数列,再出队)
    QUEUE[0]=root;//让根入队
    while(rear!=front)//当队列不为空时,持续地进行层序遍历
    {
        int colsize=0;//存放每一层的最后一个元素下标
        int last=rear;//用last存放每一层入队的最后一个元素的位置
        res[*returnSize]=(int*)malloc(sizeof(int)*(last-front));//为当前层的数列分配空间,[*returSize]就相当于a[i][t]中的i,last-front就代表这一层的元素个数
        while(front<last)//当当前层还没有全部出队完时
        {
            out=QUEUE[front++];//出队以及存放出队的元素
            res[*returnSize][colsize++]=out->val;//将出队元素存放进数组中
            if(out->left!=NULL)
            {
                QUEUE[rear++]=out->left;//当出队元素左子树不为空时,让它的左孩子入队
            }
            if(out->right!=NULL)
            {
                QUEUE[rear++]=out->right;//同上
            }
        }
        (*returnColumnSizes)[*returnSize]=colsize;//存放当前层的元素个数
        (*returnSize)++;//层数增加一层
    }
    return res;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值