力扣102. 二叉树的层序遍历

137 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

力扣102. 二叉树的层序遍历

一、题目描述:

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

示例 1:

img

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

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

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

提示:

树中节点数目在范围 [0, 2000] 内 -1000 <= Node.val <= 1000

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目我的想法是利用队列辅助进行层序遍历。

    如果该二叉树不为空,我们将根元素入队。

    然后每次判断队列是否为空:

    (不为空=>)

    • 求当前队列的长度length。
    • 对于队列的前length个元素,将这些元素的左右子树放入队列,然后将这些元素弹出。
  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    出大问题,刚开始我把childNodes.append(node.left)childNodes.append(node.right)写成了queue.append(node.left)以及queue.append(node.right),我因为queue遍历时不能变化,因为range不会变化,所以我想当然遍历列表queue也不会变化,事实打了我一耳光。。。我们可以通过先将下一层放到childNodes中,遍历这一层完毕再将childNodes交给queue。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    所有的解法都大同小异,广度优先遍历算法。大佬用C语言的方法比较吸引我~

     /**
      * 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().
      */
     /**
      * 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().
      */
     int** levelOrder(struct TreeNode* root,int* returnSize,int** returnColumnSizes)
     {
         *returnSize = 0;
         if(root == NULL)
             return NULL;
         int** returnNums = (int**)malloc(sizeof(int*) * 2001);
         *returnColumnSizes = (int*)malloc(sizeof(int) * 2001);
         struct TreeNode* queueDat[2001];
         int  queueFront = 0;
         int  queueRear  = 0;
         struct TreeNode* cur;
     ​
         queueDat[queueRear++] = root;
         while(queueFront != queueRear)
         {
             int colSize = 0;
             int last = queueRear;
             returnNums[*returnSize] = (int*)malloc(sizeof(int) * (last - queueFront));
             while(queueFront < last)
             {
                 cur = queueDat[queueFront++];
                 returnNums[*returnSize][colSize++] = cur ->val;
                 if(cur -> left != NULL)
                     queueDat[queueRear++] = cur -> left;
                 if(cur -> right != NULL)
                     queueDat[queueRear++] = cur -> right;
             }
             (*returnColumnSizes)[*returnSize] = colSize;
             (*returnSize)++;
         }
         return returnNums;
     }
     ​
     ​
     作者:goodgoodday
     链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/er-cha-shu-de-ceng-xu-bian-li-cyu-yan-xi-jdk8/
     来源:力扣(LeetCode)
     著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

三、AC 代码:

 # Definition for a binary tree node.
 # class TreeNode:
 #     def __init__(self, val=0, left=None, right=None):
 #         self.val = val
 #         self.left = left
 #         self.right = right
 class Solution:
     def levelOrder(self, root: TreeNode) -> List[List[int]]:
         if(root == None):
             return []
         res = []
         queue = []
         queue.append(root)
         while(len(queue)!=0):
             level  = []
             childNodes = []
             for node in queue:
                 level.append(node.val)
                 if(node.left):
                     childNodes.append(node.left)
                 if(node.right):
                     childNodes.append(node.right)
                 queue = childNodes
             res.append(level)    
         return res

image.png

四、总结:

二叉树的层序遍历,被评定为中等难度,我看只要思路理清,比其他的中等难度题目还是稍微简单一些,此题目务必要再刷几次!