剑指offer32-1,从上到下打印二叉树

Posted sbb-first-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer32-1,从上到下打印二叉树相关的知识,希望对你有一定的参考价值。

技术图片

 

 

解题思路:

  • 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。
  • BFS 通常借助 队列 的先入先出特性来实现。

技术图片

 

算法流程:
特例处理: 当树的根节点为空,则直接返回空列表 [] ;
初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
BFS 循环:                 

       当队列 q为空时跳出;

                 出队: 队首元素出队,记为 node;
                 打印: 将 node.val 添加至列表 tmp 尾部;
                 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
返回值 返回打印结果列表 res 即可。

作者:jyd
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/solution/mian-shi-ti-32-i-cong-shang-dao-xia-da-yin-er-ch-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     struct TreeNode *left;
 6  *     struct TreeNode *right;
 7  * };
 8  */
 9 
10 
11 /**
12  * Note: The returned array must be malloced, assume caller calls free().
13  */
14  typedef struct queue{
15      struct TreeNode *data[1009];
16      int front;
17      int rear;
18  };
19 typedef struct queue QUEUE;
20  int *levelOrder(struct TreeNode *root, int *returnSize)
21 {
22     //判断树是否为空
23     if(root==NULL)
24     {
25         *returnSize=0;
26         return NULL;
27     }
28     //将根节点入队。
29     QUEUE *q=(QUEUE *)malloc(sizeof(QUEUE));
30     q->front=0;
31     q->rear=1;
32     q->data[0]=root;
33     int n=-1;
34     int *res=(int *)malloc(sizeof(int)*1009);
35     //BFS
36     while(q->front!=q->rear)
37     {
38         if(q->data[q->front]->left)
39         {
40             q->data[(q->rear)++]=q->data[q->front]->left;
41         }
42         if(q->data[q->front]->right)
43         {
44             q->data[(q->rear)++]=q->data[q->front]->right;
45         }
46         //出队
47         n++;
48         res[n]=q->data[q->front]->val;
49         q->front++;
50     }
51     *returnSize=n+1;
52     return res;
53 }

在写代码中的一些问题:

在程序第29行中使用QUEUE *q=(QUEUE*)malloc(sizeof(QUEUE));此种情况定义的是一个指针,因此在对队列的结构体进行操作时。应用“->”来进行操作。若使用了“.”则会出现以下错误:error:‘q‘ is a pointer:did you mean to use ‘->‘的错误

若将程序第29行应用QUEUE q;使用’->‘会出现:error: invalid type argument of ‘->‘(have ‘QUEUE‘ {aka ‘struct queue‘})。将文中的对队列的结构体操作用‘.’来代替“->”.程序能够运行。

因此从以上可知:对于直接传入结构体,使用‘.‘去访问,

        对于传入结构体指针,使用‘->‘去访问。

 

以上是关于剑指offer32-1,从上到下打印二叉树的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer打卡32-1.从上到下打印二叉树

剑指Offer打卡32-1.从上到下打印二叉树

剑指Offer打卡32-1.从上到下打印二叉树

剑指offer32-1,从上到下打印二叉树

剑指Offer-从上到下打印二叉树

剑指 Offer 32 - III. 从上到下打印二叉树 III(java解题)