一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
力扣102. 二叉树的层序遍历
一、题目描述:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入: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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
这道题目我的想法是利用队列辅助进行层序遍历。
如果该二叉树不为空,我们将根元素入队。
然后每次判断队列是否为空:
(不为空=>)
- 求当前队列的长度length。
- 对于队列的前length个元素,将这些元素的左右子树放入队列,然后将这些元素弹出。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
出大问题,刚开始我把
childNodes.append(node.left)和childNodes.append(node.right)写成了queue.append(node.left)以及queue.append(node.right),我因为queue遍历时不能变化,因为range不会变化,所以我想当然遍历列表queue也不会变化,事实打了我一耳光。。。我们可以通过先将下一层放到childNodes中,遍历这一层完毕再将childNodes交给queue。 -
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
所有的解法都大同小异,广度优先遍历算法。大佬用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
四、总结:
二叉树的层序遍历,被评定为中等难度,我看只要思路理清,比其他的中等难度题目还是稍微简单一些,此题目务必要再刷几次!