数据结构与算法 —— 二叉树 01
上节介绍了二叉树的一些基本概念,这篇文章开始,我们开始学习二叉树的一些算法问题,今天先看一些层次遍历的题目。
二叉树的层次遍历
题目
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
解题思路
维护一个list,list里面是当前层次的节点的集合。然后循环list,把下个层次的节点再加入到list中去,直到list为空。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution( object ): def levelOrder( self , root): """ :type root: TreeNode :rtype: List[List[int]] """ res = [] if root is None : return res q = [] q.append(root) while len (q) ! = 0 : temp = [] length = len (q) for i in range (length): r = q.pop( 0 ) if r.left: q.append(r.left) if r.right: q.append(r.right) temp.append(r.val) res.append(temp) return res |
二叉树的层次遍历II
题目
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其自底向上的层次遍历为:
[ [15,7], [9,20], [3] ]
解题思路
和上道题的思路是一致的,只是在生成结果的时候把数据插入到最前面,用到list的insert方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution( object ): def levelOrderBottom( self , root): """ :type root: TreeNode :rtype: List[List[int]] """ res = [] if not root: return res q = [] q.append(root) while len (q) > 0 : temp = [] length = len (q) for i in range (length): node = q.pop( 0 ) if node.left: q.append(node.left) if node.right: q.append(node.right) temp.append(node.val) res.insert( 0 ,temp) return res |
二叉树的最小深度
题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回它的最小深度 2.
解题思路
和前面的解题思路基本一致,就是要再维护一个int的deep记录最小的深度,当左右节点都为空的时间,直接就可以返回了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution( object ): def minDepth( self , root): """ :type root: TreeNode :rtype: int """ if not root: return 0 q = [] q.append(root) deep = 0 while len (q)! = 0 : deep + = 1 length = len (q) for i in range (length): node = q.pop( 0 ) if not (node.left or node.right): return deep else : if node.left: q.append(node.left) if node.right: q.append(node.right) |
总结一波:对于二叉树的层次遍历,只要一直维护当前层次的node的list就好了。感觉最重要的事情就是这样。
coding交流群:226704167,愿和各位一起进步!
微信公众号:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!