剑指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,从上到下打印二叉树的主要内容,如果未能解决你的问题,请参考以下文章