剑指Offer:[第6天 搜索与回溯算法(简单)]--->从上到下打印二叉树Ⅰ


一、题目描述

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树[3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回:

[3,9,20,15,7]

提示:
节点总数<=1000


二、思路分析

注:思路分析中的一些内容和图片参考自力扣各位前辈的题解,感谢他们的无私奉献

思路

二叉树的层序遍历又称为二叉树的广度优先搜索(BFS),BFS通常借助队列的先入先出特性来实现。从根结点开始 ,首先根结点进入这个队列。进入队列之后,接下来做一个循环,每次循环就是基本的过程就这样的:从队列里面拎出一个元素访问该结点,然后把这个结点的左右儿子放到队列里面去,再进入下一个循环。再从队列里面拎出一个元素出来,访问这个结点,再把它的左右儿子放到队列里去…
复杂度分析:
时间复杂度 O ( N ) \rm{O(N)} O(N)N为二叉树的节点数量,即BFS需循环N次。
空间复杂度 O ( N ) \rm{O(N)} O(N): 最差情况下,即当树为平衡二叉树时,最多有N/2个树节点同时在queue中,使用O(N)大小的额外空间。
在这里插入图片描述


三、整体代码

整体代码如下

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

#define MAX_SIZE 1001
int* levelOrder(struct TreeNode* root, int* returnSize){
    *returnSize = 0;    //二叉树结点数,初始化为0
    if (!root) {        //如果根结点为空,返回NULL
        return NULL;
    }
    int *ans = (int*)malloc(sizeof(int)*MAX_SIZE);  //ans为返回的数组,为其分配内存空间
    struct TreeNode *queue[MAX_SIZE];               //创建一个队列,用于树的各个结点后序的入队出队操作
    int head = -1;          //队首元素的下标
    int tail = 0;           //队尾元素后面的位置,下次入队的元素就插在这里
    queue[++head] = root;   //先将根结点入队
    tail++;                 
    while (head < tail) {
        struct TreeNode *tmp = queue[head++]; //出队一个结点
        ans[(*returnSize)++] = tmp->val;      //将结点的值保存进ans
        //如果左孩子存在,则左孩子入队。如果右孩子存在,则右孩子入队。
        if (tmp->left != NULL) {
            queue[tail++] = tmp->left;
        }
        if (tmp->right != NULL) {
            queue[tail++] = tmp->right;
        }
    }
    return ans;
}

运行,测试通过
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知初与修一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值