热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Leetcode102二叉树的层序遍历详解

Leetcode102-二叉树的层序遍历详

   往期博客:

Leetcode1-两数之和详解

Leetcode2-两数相加代码详解

Leetcode20-有效的括号详解

Leetcode21-合并两个有序链表详解

Leetcode22-有效括号生成详解

Leetcode24-两两交换链表中的节点详解

Leetcode27-移除元素详解

Leetcode46-全排列详解

Leetcode49-字母异位分组详解

Leetcode53-最大子数组和详解

Leetcode56-合并区间详解

LeetCode57-插入区间详解

Leetcode77-组合详解

Leetcode78-子集详解

Leetcode90-子集II详解

Leetcode94-二叉树的中序遍历详解


目录

题目

示例

解析

广度优先搜索

深度优先搜索

代码

广度优先搜索

深度优先搜索


题目

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

题目分析

已知:二叉树根节点

目的:层序遍历

要求:从左到右访问二叉树


示例

示例1

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

示例2

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

示例3

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


解析

广度优先搜索

对于示例1,二叉树总共有3层,层序遍历需要先遍历第一层得到子集[3],再遍历第二层得到子集[9,20],最后遍历最后一层得到子集[15,7]。对于Leetcode94-二叉树的中序遍历这一题中遍历的大致方向是从上到下遍历,但是输出是从下到上输出,因为要从上到下找到最左左节点,然后从上到下从最左左节点一次输出,这满足栈的先进后出的特点,所以用栈方法来做题。而本题是逐层遍历,即从上到下遍历,并从上到下输出,这就满足了队列先进先出的思想,所以本题可以使用队列来做题。

 首先初始化三个变量,其中res存放每一层遍历的子集,size为每一层节点个数,queue为队列

 遍历第一层时,size=1,将节点3加入队列中,此时size=1,则只从队列中取出一个元素,即元素3,放到结果集中

此时,将节点3的左右孩子加入队列中,size=2 ,在出队的时候,先出9,当出9后查看节点9有没有左右孩子,有的话紧接着入队,没有的话出20,因为size=2,所以只出2个元素。

最后入队15和7,再逐一出队

 深度优先搜索

深度优先搜索是从上到下遍历二叉树的,所以这跟题目要求逐层遍历是相斥的,但是既然深度优先搜索是从上到下遍历那么可以根据层将元素归类,此时要确定每个元素属于那一层,并将该元素放入对应层的子集中。

例如对于如下二叉树,总共包含3层 ,那么他的结果集中一定包含3个子集,每个子集包含每层的元素

首先遍历第一层即root节点1,节点1属于0层节点,所以将3放入子集0中,然后遍历到节点2,及节点2属于1层,则将2放入子集1中,然后遍历到节点4,节点4属于2层,则将4放入子集2,依次进行直到所有节点遍历完 


代码

广度优先搜索

class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: result = [] if root is None: return result q = deque([]) # 创建队列 q.append(root) # 将根节点加入队列中 while len(q) > 0: size = len(q) ls = [] # 用于存放每一层遍历到的节点 while size > 0: cur = q.popleft() ls.append(cur.val) if cur.left is not None: q.append(cur.left) if cur.right is not None: q.append(cur.right) size = size-1 result.append(ls[:]) return result

深度优先搜索

class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: result = [] if root is None: return result self.dfs(root, result, 0) return result def dfs(self, node, result, level): if node is None: return if level > len(result)-1: result.append([]) # 向结果集中谈价空子集,用来存放当前层的元素 result[level].append(node.val) if node.left is not None: self.dfs(node.left, result, level+1) if node.right is not None: self.dfs(node.right, result, level+1)

推荐阅读
  • 本文概述了算法的基础概念,包括时间复杂度的计算规则,以及常见的递归算法的时间复杂度分析。同时,详细介绍了数组和链表的基本特性及其操作的时间复杂度,并提供了几个关于链表操作的具体示例。最后,探讨了栈和队列的概念及其应用,包括如何利用这些数据结构解决实际问题。 ... [详细]
  • 连续正数序列之和等于目标值的解法探讨
    给定一个正整数目标值,找出所有连续正整数序列,其和等于目标值。这些序列需至少包含两个数,且序列中的数字应从小到大排列。不同的序列根据其首个数字的大小顺序排列。 ... [详细]
  • 本文介绍了一道来自《紫书》的编程题目——UVa11212 编辑书稿。该问题通过迭代加深搜索(IDA*)算法解决,旨在找到将给定排列转换为升序排列所需的最少步骤。文章提供了详细的解题思路和代码实现。 ... [详细]
  • 本章探讨了使用固定数组实现栈和队列的基本方法,以及如何通过这些基本结构来实现更复杂的操作,如获取栈中的最小值。此外,还介绍了如何利用栈来模拟队列的行为,反之亦然。 ... [详细]
  • Canvas漫游:碰撞检测与动画模拟
    探索Canvas在Web开发中的应用,通过碰撞检测与动画模拟提升交互体验。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • 详解 | 日志系统ViseLog的基本使用与功能
    本文详细介绍了日志系统ViseLog的使用方法及其核心功能,旨在帮助开发者更好地理解和利用这一工具,提高开发效率。 ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
  • 本文概述了五种常用的查找算法:线性查找、二分查找、二叉搜索树查找、哈希查找和索引查找。每种方法都有其适用场景和性能特点。 ... [详细]
  • 在研究Linux内核代码时,经常会遇到与‘队列’相关的术语。本文旨在全面介绍Linux系统中几种常见的队列类型及其应用,帮助读者更好地理解和使用这些机制。 ... [详细]
  • BFS深搜hashtable来判断是横线还是竖线但是为啥还是90分啊呜呜!找不到原因#define_CRT_SECURE_NO_WARNINGS1#include ... [详细]
  • java程序员_Java程序员最新职业规划,逆袭面经分享
    java程序员_Java程序员最新职业规划,逆袭面经分享 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • MainActivityimportandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;im ... [详细]
  • Java性能优化策略详解
    在Java开发中,性能优化是提高应用程序响应速度和资源利用率的关键。本文详细探讨了多种Java性能优化技巧,包括合理使用单例模式、避免滥用静态变量、减少对象创建、使用final修饰符、合理管理线程同步等,旨在帮助开发者写出更加高效稳定的代码。 ... [详细]
author-avatar
mobiledu2502892717
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有