zoukankan      html  css  js  c++  java
  • 剑指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'})。将文中的对队列的结构体操作用‘.’来代替“->”.程序能够运行。

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

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

  • 相关阅读:
    Git checkout on a remote branch does not work
    制作ubuntu U盘安装盘
    Angular 2.0 和 1.x比较
    图文浅谈css3
    前后端数据交互方法
    CSS实现响应式全屏背景图
    html5图片高度自适应解决方法
    2014年最后100天,想说点啥。
    js常用代码
    html5+css3开发总结
  • 原文地址:https://www.cnblogs.com/sbb-first-blog/p/13296572.html
Copyright © 2011-2022 走看看