二叉树的层序遍历

题目:

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

示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:

输入:root = [1]
输出:[[1]]
示例 3:

输入:root = []
输出:[]

思路:(队列+迭代)
在学习二叉树的时候我们简要的学习了二叉树的三大遍历方式,先序遍历,中序遍历,后序遍历。这三种遍历方式均可以用递归的方法来实现,但今天的这个层序遍历有些不同。我们读懂题目后第一思路应该是设计一种算法来一层一层从左到右的放进队列然后利用队列先进先出的性质,再把队列的值转入到一个数组中去,最后返回这个数组即可。

代码实现:

/**
 * 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().
 */
//这个题中的接口有三个,一个root,一个returnsize,一个returncolumnsize,这个题最开始
就是要先看懂这三个接口的意思,returnsize是要我们返回这个二叉树的层数,而returncolumnsize是
要我们返回每一层的节点个数
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
//按照思路我们要返回一个数组,先动态创建一个二维数组,因为到时候,从队列弹出的每层的元素,都要
往这个数组里放,所以这个数组既要有层数,也要有列数。
    int** ans=(int*)malloc(sizeof(int*)*2000);
//然后不要忘记给returnsize赋初始值,
    *returnSize=0;
    if(root==NULL){
        return NULL;
    }
    int columnSizes[2000];
//模拟队列,队列里存储的是一个一个完整的二叉树的结点,所以类型为struct类型
    struct TreeNode* queue[2000];
    int rear=0, head=0;
    queue[rear++]=root;

//一层一层遍历,把结点放到队列,再弹出到数组
    while(rear!=head){
//因为每层的节点数不一样,所以每遍历到新的一层都要进行新的动态分配
        ans[(*returnSize)]=(int*)malloc(sizeof(int*)*(rear-head));
        columnSizes[(*returnSize)]=rear-head;
//因为在while循环中我们要对结点的左右子节点进行检查,以及检查后的压入队列,rear要++
所以我们要提前记录好head的位置,并且提前把head移动到rear的位置,为下一层的遍历做准备
        int start=head;
        head=rear;
        for(int i=start;i<head;i++){
            ans[(*returnSize)][i-start]=queue[i]->val;
            if(queue[i]->left){
                queue[rear++]=queue[i]->left;
            }
            if(queue[i]->right){
                queue[rear++]=queue[i]->right;
            }
        }
//层数++
        (*returnSize)++;
    }
    *returnColumnSizes=(int*)malloc(sizeof(int*)*(*returnSize));
    for(int i=0;i<*returnSize;i++){
        (*returnColumnSizes)[i]=columnSizes[i];
    }
    return ans;
}


 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值